---
title: 基础面试题
date: 2023-08-02 20:28
mdate: 2023-08-02 21:38:53
---
# Java 基础

1. 什么是字节码，使用字节码的好处是什么
字节码是通过 JavaC 编译器编译出来的可通过 JVM 执行的代码，字节码可以在不同的平台上的 JVM 上执行，从而可以在不重新编译的情况下做到一次编写，处处执行

2. 为什么不全部使用 AOT
通过 jit 可以针对实际运行时的代码进行优化编译，提高运行效率，AOT 无法针对运行时的所有可能情况进行完全优化

3. continue，break，return 区别

4. 包装类型的缓存机制
4 种整数类型的包装类都缓存了-128，127 的值，Character 则是 0，127 的值，Boolean 直接返回 True/False
如果超出这个值就会去建立一个新的对象，否则就是缓存中的对象
但是使用构造方法 new 出来的不是在缓存里

5. 面向对象和面向过程
面向过程会将解决问题的过程拆解为一个一个方法，通过执行方法来解决问题
面向对象会将要解决的问题抽象出对象，在通过对象执行特定的方法来解决问题

6. 深拷贝和浅拷贝的区别
浅拷贝创建出了一个新的对象，但是内部其他的属性如果是引用类型，则还是原来的引用地址
深拷贝完全复制了整个对象以及内部的属性对象

7. Object 类的方法

8. equals 和 ==
==在基本数据类型比较值，在引用数据类型比较地址
equals 比较的是两个对象是否相等，比较时要重写该对象的 equals 方法和 hashCode 方法，否则和==一样

9. hashCode
通过 hashCode 可以获取该对象的哈希码，确定该对象在 hash 表的索引位置
hashSet 在添加对象是，会先通过 hashCode 判断加入位置，没有重复则判断该对象没有重复出现，否则使用 equals 来判断是否相等，相同就不添加，不同就散列到其他位置，从而减少调用 equals 方法
在 hash 的容器中可以大大提高其运行效率

10. 重写 hashCode 和 equals 方法
hashcode 相同，不一定是同一个对象
equals 判断相同，但是 hashcode 值不一定相等

11. String 不可变
String 中使用了 final 关键字来修饰数组保存字符串
StringBuffer 可变
StrignBuilder 可变且线程安全

12. 使用+和 StringBuilder
在循环内使用+会产生大量临时 StrignBuilder对象，但是 JDK9 后改用动态方法 makeConcatWithConstants()方法实现

13. 字符串常量池
保存的是该字符串在堆中的引用，如果新建一个字符串在字符串常量池中有缓存则会直接返回该对象的地址

14. 常量折叠

15. String#intern 方法

16. 异常
分为 Exception 和 Error，都继承 Throwable 类，
异常还分 CheckedException（编译时必须捕获否则通不过） 和 uncheckedException（RuntimeException）

17. finally 一定会执行码
不一定，程序如果在 fnally 之前中止就不会执行，System.exit()线程死亡，关闭 CPU

18. try-with-resource

19. 泛型
可以在编译时对对象的类型进行检测，从而避免类型不一致报错
泛型类，泛型接口，泛型方法

20. 反射
程序运行时，通过反射可以动态的获取一个类的实例
在 Spirng 和 Mybatis 中大量运用了动态代理，而这就是反射实现的，通过反射可以获取该类上的注解从而对该类进行进一步的处理@Component，@Value

21. SPI 和 API

22. 序列化和反序列化
序列化是将对象当前的状态转换为二进制字节流的过程
反序列化是将二进制字节流转换回对象的过程
用于网络传输，对象存储到文件，数据库，内存中
不想要序列化的变量使用 **transient** 关键字修饰

