- JDK 和 JRE 有什么区别?
jdk Java 开发工具包 jdk 是整个 Java 开发的核心
jre Java 运行时环境
jvm java虚拟机 它只认识 xxx.class jvm 是 Java 能够跨平台的核心
- == 和 equals 的区别是什么?
==比较内存地址
equals比较的是值
- 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对 如果equals()为处则hashCode一定相等
- final 在 Java 中有什么作用?
final修饰类不能被继承
修饰方法不能被重写
修饰变量自定义常量
- Java 中的 Math.round(-1.5) 等于多少?
-1.5的绝对值是-1
-1.500000001的绝对值是-2
- String 属于基础的数据类型吗?
不属于因为string是类,是被final修饰的
- Java 中操作字符串都有哪些类?它们之间有什么区别?
string stringBuffer stringBuilder
string 常量赋值 使用+或者concat()来拼接字符串 每次拼接都需要新的内存
拼接效率低
stringBuffer stringBuilder 必须通过new实例化复制 使用append()方法追加字符串
不需要新的内存空间 拼接效率高
stringBuilder 是线程不安全的 而stringBuffer是线程安全的 因为有线程锁关键字
- String str="i"与 String str=new String(“i”)一样吗?
用==比较是不一样的 ==比较的是内存地址 实例化存放在堆中 而str是存放在栈中
用eques比较值是一样
- 如何将字符串反转?
// 递归方法
public static String reverse1(String s) {
int length = s.length();
if (length <= 1){
return s;
}
String left = s.substring(0, length / 2);
String right = s.substring(length / 2, length);
return reverse1(right) + reverse1(left);
}
- String 类的常用方法都有那些?
length()//返回该字符串的长度
charAt(int index)//返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1。
substring(int beginIndex)//该方法从beginIndex位置起,从当前字符串中取出剩余的字符作为一个新的字符串返回。
substring(int beginIndex, int endIndex)//该方法从beginIndex位置起,从当前字符串中取出到endIndex-1位置的字符作为一个新的字符串返回。
compareTo(String anotherString)//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
compareToIgnore(String anotherString)//与compareTo方法相似,但忽略大小写。
equals(Object anotherObject)//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
equalsIgnoreCase(String anotherString)//与equals方法相似,但忽略大小写。
concat(String str)//将参数中的字符串str连接到当前字符串的后面,效果等价于"+"。
indexOf(int ch/String str)//用于查找当前字符串中字符或子串,返回字符或子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。
indexOf(int ch/String str, int fromIndex)//改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。
lastIndexOf(int ch/String str)//该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。
lastIndexOf(int ch/String str, int fromIndex)//该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。
toLowerCase()//返回将当前字符串中所有字符转换成小写后的新串
toUpperCase()//返回将当前字符串中所有字符转换成大写后的新串
replace(char oldChar, char newChar)//用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串。
replaceFirst(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。
replaceAll(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。
trim()//截去字符串两端的空格,但对于中间的空格不处理。
split(String str)//将str作为分隔符进行字符串分解,分解后的字字符串在字符串数组中返回。
- 抽象类必须要有抽象方法吗?
抽象类不一定有抽象方法,也可以有普通方法
抽象方法必须出现在抽象类中
- 普通类和抽象类有哪些区别?
抽象类不能实例化
抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
含有抽象方法的类必须声明为抽象类
抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。
- 抽象类能使用 final 修饰吗?
可以,但是被final修饰后的抽象类失去了抽象类的作用,抽象类不能被继承
- 接口和抽象类有什么区别?
抽象类有默认的实现方式,接口完全是抽象的他完全不存在方法的实现
子类使用关键字extends来继承抽象类,如果子类不是抽象类的话,他需要提供抽象类中所有的声明方法的实现/ 接口子类使用关键字implements来实现接口,他需要提供接口中所有声明的方法的实现
抽象方法可以有public、protected和default这些修饰符,接口方法默认修饰符是public。你不可以使用其它修饰符
抽象方法可以有main方法并且我们可以运行它,接口没有main方法,因此我们不能运行它。(java8以后接口可以有default和static方法,所以可以运行main方法)
抽象方法可以继承一个类和实现多个接口,接口只可以继承一个或多个其它接口
它比接口速度要快,接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。,如果你往接口中添加方法,那么你必须改变实现该接口的类。
- Java 中 IO 流分为几种?、
将不同的输入输出源通过流的形式进行相关操作(输入,输出),流是一种抽象描述,在程序中表示数据的一种转移方式
Jdk提供了各种不同的流用于处理不同的输入输出源,根据流性质划分分为以下类型:
按流向分(站在程序角度考虑)
输入流(input)
输出流(output)
按类型分:
字节流(InputStream/OutputStream)
任何文件都可以通过字节流进行传输。
字符流(Reader/Writer)
非纯文本文件,不能用字符流,会导致文件格式破坏,不能正常执行。
节点流(低级流:直接跟输入输出源对接)
FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter.
处理流(高级流:建立在低级流的基础上)
转换流:InputStreamReader/OutputStreamWriter,字节流转字符流/字符流转字节流
缓冲流:BufferedInputStream/BufferedOutputStream BufferedReader/BufferedReader可对节点流经行包装,使读写更快
- BIO、NIO、AIO 有什么区别?
BIO是一个连接一个线程
NIO是一个请求一个线程
AIO是一个有效请求一个线程
- Files的常用方法都有哪些?
public static void main(String[] args) throws IOException {
//创建方法
/* @SuppressWarnings("unused")
File file = new File("F:\\a.txt");
System.out.println("创建成功了吗?"+file.createNewFile());
System.out.println("单级文件夹创建成功了吗?"+file.mkdir());
System.out.println("多级文件夹创建成功了吗?"+file.mkdirs());
File dest = new File("F:\\电影\\c.txt");
System.out.println("重命名成功了吗?"+file.renameTo(dest));
*/
/* //删除方法
File file = new File("F:\\电影");
System.out.println("删除成功了吗?"+file.delete());
file.deleteOnExit();
*/
//判断方法
/* File file = new File("F:\\a.txt");
System.out.println("文件或者文件夹存在吗?"+file.exists());
System.out.println("是一个文件吗?"+file.isFile());
System.out.println("是一个文件夹吗?"+file.isDirectory());
System.out.println("是隐藏文件吗?"+file.isHidden());
System.out.println("此路径是绝对路径名?"+file.isAbsolute());
*/
//获取方法
/*
File file = new File("f:\\a.txt");
System.out.println("文件或者文件夹得名称是:"+file.getName());
System.out.println("绝对路径是:"+file.getPath());
System.out.println("绝对路径是:"+file.getAbsolutePath());
System.out.println("文件大小是(以字节为单位):"+file.length());
System.out.println("父路径是"+file.getParent());
//使用日期类与日期格式化类进行获取规定的时间
long lastmodified= file.lastModified();
Date data = new Date(lastmodified);
SimpleDateFormat simpledataformat = new SimpleDateFormat("YY年MM月DD日 HH:mm:ss");
System.out.println("最后一次修改的时间是:"+simpledataformat.format(data));
*/
//文件或者文件夹的方法
File[] file = File.listRoots();
System.out.println("所有的盘符是:");
for(File item : file){
System.out.println("\t"+item);
}
File filename =new File("F:\\Java workspace\\Java");
String[] name = filename.list();
System.out.println("指定文件夹下的文件或者文件夹有:");
for(String item : name){
System.out.println("\t"+item);
}
File[] f = filename.listFiles();
System.out.println("获得该路径下的文件或文件夹是:");
for(File item : f){
System.out.println("\t"+item.getName());
}
}