java常见面试题汇总
摘自 https://knife.blog.csdn.net/article/details/121219272
基础篇
1、java中 == 和 equals 的区别?
== 是比较运算符,Equals 是方法
== 在判断基本数据类型的时候,就是判断数值是否相等,比如int 10 和 int 20的时候就是判断10 和20 这两个数是否相等
== 在判断引用数据类型的时候,也就是对象是否相等的时候,判断的是内存地址是否相等,也就是这两个对象是否就是同一个对象。
总结: ==判断基本数据类型的值,判断引用数据类型的内存地址。
Equals是定义在Object类的方法,不同类有不同的实现。
用Integer 和 String这两个阐述一下,从而理解Equals方法的设计思想。
Integer的Equals方法通过三步完成比较:内存地址是否相同; 类型是否相同;数值是否相同;(当判断内存地址一致时就不会再判断后面的两项,当内存地址不同才会判断下一项。)
String的Equals方法通过四步完成比较:内存地址是否相同;类型是否相同;长度是否相同;每个字符是否相同;
总结:Equals方法最终目的是比较内容相同。
2、java中Integer和int有什么区别?
基本类型与引用类型:int是基本数据类型,直接存储数值,而Integer是对象,它的实例是引用类型,存储的是对象的引用。
默认值:int的默认值为0,而Integer的默认值为null。
操作符支持:对于int类型我们可以使用比较操作符==来比较两个变量的值是否相等,而对于Integer对象,使用==比较得到的是两个Integer对象的引用地址是否相等,比较的是两个对象的地址而非真正的数值。如果要比较Integer对象包含的数值是否相等,需要使用equals()方法。
null安全性:int类型的值始终有明确的默认值0,不存在空值。但是Integer类型的值可以为null,因此在使用Integer类型时,需要对null做特殊处理,否则可能会产生`NullPointerException`。
泛型支持:由于Java泛型的设计限制,Java泛型不能用于基本数据类型。这就意味着我们不能使用ArrayList<int>,但是我们可以使用ArrayList<Integer>。
方法支持:Integer类提供了更多的方法,例如将一个字符串转换成整数、将一个整数转换成不同进制的字符串等。这些方法在int类中并不存在。
3、Java的String的intern方法的作用
从字符串常量池中查询当前字符串是否存在(通过equals判断)。
如果存在,返回常量池中的字符串引用。
如果不存在,把这个String对象引用存到常量池,然后返回这个String对象的引用。
@Test public void printInfo(){ String s1 = new String("1"); s1.intern(); String s2 = "1"; System.out.println(s1 == s2); String s3 = new String("11"); String s4 = "11"; String s5 = s3.intern(); System.out.println(s4 == s5); }
原理
4、如何修改String对象的数据?
String不可变的含义是:将一个已有字符串"123"重新赋值成"456",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。
也就是说:不可变的含义是内部数据不可变,而不是说引用不可变。
String的内部数据是一个char数组,是对字符串数组的封装,并且是被final修饰的,创建后不可改变。
String不可变的好处:便于实现字符串池(String pool)、使多线程安全、避免安全问题、加快字符串处理速度。
5、static -- 为什么静态方法不能调用非静态方法和变量?
与类加载顺序有关,加载静态方法时,非静态的未初始化。
6、异常 -- 异常类型
Java异常的层次结构
Throwable有两个直接的子类: Error、Exception。
Error
JVM内部的严重问题,比如资源不足等,无法恢复。
处理方式: 程序员不用处理
Exception
JVM通过处理还可回到正常执行流程,即:可恢复。
分RuntimeException和其他Exception,或者说分为非受检异常(unchecked exception)和受检异常(checked exception)。
使用建议:将checked exceptions用于可恢复的情况,将unchecked exception用于编程的错误。
Use checked exceptions for recoverable conditions and runtime exceptions for programming errors (Item 58 in 2nd edition)
RuntimeException(unchecked exception)
处理或者不处理都可以(不需try...catch...或在方法声明时throws)
其他Exception(checked exception)
Java编译器要求程序必须捕获(try...catch)或声明抛出(方法声明时throws)这种异常。
7、异常 -- catch里return了,finally是否执行?
如果catch或者finally中有return,则catch和finally代码块之后的部分根本不会执行到。
如果catch和finally中没有return,后边的(也就是finally的)return会作为返回值。
try,catch执行到了return之前都会执行finally
不要在try里return。
正常用法:
执行结果(try=> catch=> finally=> finally块之外)
8、IO -- 字节流与字符流的区别?
9、JDK8 --- JDK8新特性
接口允许default和static;lambda;stream;时间新API(LocalDateTime等)CompletableFuture等
10、集合list -- ArrayList是否线程安全?如何线程安全地操作ArrayList?
11、集合list -- ArrayList扩容机制?
https://knife.blog.csdn.net/article/details/120944429
12、