1.JDK和JRE的区别?
JDK是Java的开发工具包,提供了Java所需要的的开发和运行环境。
JRE是Java的运行环境,为Java运行提供了所需要的的环境。
总结:
JDK包含了JRE同时也包含了Java的编译环境javac,同时包含了Java的程序调试和分析工具。
2.==和equals的区别?
==:基于数据类型和引用类型 == 的作用效果是不同的
基本类型:比较的是值是否相等。
引用类型:比较的是引用的地址是否相同。
equals: 默认的情况是引用比较,很多类重新了equals方法,一般情况就是比较值是否相等。
总结:
==对于基于数据类型比较的是值的比较,引用类型是值的比较。
equals默认情况下是引用类型的比较,只是很多类重写了equals方法,比较的值是否相等。
3.两个对象的hashCode()相同,equals也一定为true?
不对,两个hashCode相等,equals不一定为true。
代码示例:
String str1 = "张";
String str2 = "王";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
代码解读:
很显然“张”和“王”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
4.final在Java中的有什么作用?
final修饰的类叫最终类,该类不能被继承。
final修饰的方法不能被重写。
final修饰的变量叫常量,常量必须初始化,初始化的变量值不能被修改。
5.String属于基础类型吗?
String不属于基本数据类型。
基本数据类型有8种,byte、Boolean、char、short、int、float、long、double。
6.Java中操作字符串都有哪些类?
操作字符串的类有:String、StringBuffer、StringBuilder。
String和StringBuffer、StringBuilder的区别在String声明的是不可变对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer和StringBuild可以在原来有对象的基础上进行操作。
StringBuild和StringBuffer的相同:
都继承了都继成了AbstractStringBuilder这个抽象类,实现了CharSequence接口
其append方法都是 super.append(str),调用了父类AbstractStringBuilder的append(String str)方法初始容量都是16和扩容机制都是"旧容量*2+2"底层都是用char[]字符数组 实现,且字符数组都是可变的,这点不同于String
StringBuild和StringBuffer的不相同:
StringBuffer多线程安全的,StringBuilder多线程不安全
StringBuffer比StringBuilder多了一个toStringCache字段,用来在toString方法中进行 缓存,每次append操作之前都先把toStringCache设置为null,若多次连续调用toString方法,可避免每次Arrays.copyOfRange(value, 0, count)操作,节省性能。
由于StringBuilder没有考虑同步,在单线程情况下,StringBuilder的性能要优于StringBuffer
这个才是我们重点讨论的,单线程下StringBuffer加了synchronized,虽然是单线程, 但是synchronized获取锁和释放锁也还是需要时间的, 而StringBuilder没有,这个就是重点区别。因此重点要讨论synchronized锁的状态,从获取锁到释放锁的过程,因此需要讨论一下锁的升级和优化。
7.String str=“i”,和String str = new String(“i”)一样吗?
不一样;内存分配方式不一样。String str=“i”的方式java虚拟机将其分配常量池中;而String str = new String(“i”)将会分到堆内存中。
8.如何将字符串反转?
使用StringBuffer和StringBuilder中的reverse()方法。
9.String类的常用方法?
indexOf(): 返回指定字符的索引;
charAt(): 返回指定索引处的字符;
replace(): 字符串替换;
trim(): 去除字符串两端空白;
split(): 分割字符串,返回一个分割后的字符串;
getBytes(): 返回字符串的byte类型数组;
length(): 返回字符串的长度;
toLowerCase(): 将字符串转化成小写字符;
toUpperCase(): 将字符串转换成大写字符;
substring(): 截取字符串;
equals(): 字符串比较;
10.抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法。
11.普通类和抽象类有哪些区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
12.抽象类能使用final修饰吗?
不能:定义抽象类是让其他类进行继承的,如果使用final修饰就无法继承。
13.接口和抽象类有什么区别?
实现:抽象类的子类使用extends来继承,接口必须使用implements来实现接口。
构造函数:抽象类可以有构造函数;接口不能有。
Main方法:抽象类可以有main方法,并且我们可以运行,接口则不行。
实现数量:类可以实现很多个接口,但是只能继承一个抽象类。
访问修饰符:接口方法默认的是public,抽象类可有任意修饰访问
14.Java中的IO流分为几种?
按功能来分:输入流(input)、输出流(output)。
按类型类分:字节流、字符流。
字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。
16.BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
17.Files的常用方法都有哪些?
Files.exists():检测文件路径是否存在。
Files.createFile():创建文件。
Files.createDirectory():创建文件夹。
Files.delete():删除一个文件或目录。
Files.copy():复制文件。
Files.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件。