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、

 

 
posted @ 2024-04-30 16:13  一介桃白白  阅读(3)  评论(0编辑  收藏  举报