Java基础面试题(基础篇)
Java基础面试题(基础篇)
1. Java 为什么是“平台无关”的?
答: Java 源码先编译成字节码(.class),再由不同平台上的 JVM 执行。只要平台有对应 JVM,同一份字节码就能运行,这就是“Write Once, Run Anywhere”。
2. JDK、JRE、JVM 的区别是什么?
答:
- JVM:执行字节码的虚拟机。
- JRE:
JVM + 核心类库,用于运行 Java 程序。 - JDK:
JRE + 编译工具(javac)+ 调试打包工具,用于开发 Java 程序。
一句话:开发用 JDK,运行最小可用 JRE,本质执行者是 JVM。
3. == 和 equals() 有什么区别?
答:
==:比较的是地址(引用类型)或值(基本类型)。equals():默认也是比较地址,但很多类(如String)重写后比较内容。
面试延伸:重写 equals() 时通常要同时重写 hashCode(),否则在哈希容器中会出现逻辑不一致。
4. hashCode() 和 equals() 为什么必须一起看?
答: 在 HashMap/HashSet 中,先看 hashCode 定位桶,再用 equals 判断是否同一个对象。若两个对象 equals=true 但 hashCode 不同,会导致同逻辑对象被重复存储。
5. String 为什么不可变?
答:
- 便于字符串常量池复用,节省内存。
- 天然线程安全。
- 可作为哈希键(
hashCode稳定)。 - 安全性更高(如类加载路径、网络地址不易被篡改)。
6. String、StringBuilder、StringBuffer 的区别?
答:
String:不可变,频繁拼接性能差。StringBuilder:可变,线程不安全,单线程拼接首选。StringBuffer:可变,方法加同步锁,线程安全但慢一些。
7. 面向对象三大特性是什么?
答:
- 封装:隐藏实现细节,暴露必要接口。
- 继承:提高代码复用,体现“is-a”关系。
- 多态:同一父类引用调用子类实现,提升扩展能力。
8. 重载(Overload)和重写(Override)区别?
答:
- 重载:同类中方法名相同、参数列表不同,编译期多态。
- 重写:子类覆盖父类同签名方法,运行期多态。
重写规则常问:返回值协变、访问权限不能更严格、异常范围不能更大。
9. 抽象类和接口怎么选?
答:
- 抽象类适合“有共性实现”的父类模型。
- 接口适合定义“能力规范”,强调解耦。
实践里常见:核心骨架用抽象类,可插拔能力用接口。
10. final 关键字有哪些用法?
答:
final变量:值不能再改。final方法:不能被重写。final类:不能被继承(如String)。
11. static 有什么特点?
答: static 成员属于类而不属于对象,可通过类名直接访问;静态方法不能直接访问实例成员,因为它在对象创建前就可调用。
12. Java 异常体系怎么回答更完整?
答:
Throwable下分Error和Exception。Exception分为受检异常(编译期强制处理)和运行时异常(RuntimeException及子类)。
面试建议:业务代码优先抛有语义的自定义异常,避免无意义 throws Exception。
13. try-catch-finally 的执行规则?
答: 正常情况下都会执行 finally(除非 JVM 退出、线程被强杀等极端场景)。即使 try/catch 里 return,也会先执行 finally。
14. List、Set、Map 的核心区别?
答:
List:有序、可重复。Set:通常不重复(依赖equals/hashCode)。Map:键值对,键唯一。
15. ArrayList 和 LinkedList 如何选型?
答:
ArrayList:随机访问快,尾部追加高效,扩容有拷贝成本。LinkedList:中间插入删除理论上快,但随机访问慢且节点额外内存开销大。
多数业务优先 ArrayList,除非明确高频中间插删且有迭代器定位。
16. HashMap 底层原理(JDK8)怎么说?
答: 数组 + 链表 + 红黑树。哈希冲突时先链表,链表长度到阈值且数组容量足够时树化,提高极端场景查询性能。
高频补充:负载因子默认 0.75,在空间和时间之间做折中。
17. 为什么重写 equals 必须重写 hashCode?
答: 因为哈希容器先按 hashCode 分桶,再按 equals 判等。若逻辑相等对象哈希不同,会破坏去重与查找正确性。
18. 什么是泛型?有什么好处?
答: 泛型是参数化类型,主要作用:
- 编译期类型检查,减少
ClassCastException。 - 消除强转,提高可读性。
- 提高代码复用能力。
常问点:Java 泛型是“类型擦除”实现,运行时很多泛型信息会被擦除。
19. Object 类常用方法有哪些?
答:
toString():对象字符串表示。equals():对象逻辑比较。hashCode():哈希值。getClass():运行时类型。wait()/notify()/notifyAll():线程协作。clone():对象拷贝(需配合Cloneable)。
20. 深拷贝和浅拷贝区别?
答:
- 浅拷贝:只复制对象本身,内部引用共享。
- 深拷贝:递归复制引用对象,副本之间互不影响。
面试延伸:序列化方式可实现深拷贝,但要关注性能开销。
21. 反射是什么?优缺点?
答: 反射是在运行时动态获取类信息并操作字段/方法。
- 优点:灵活、可扩展,框架中大量使用(Spring、MyBatis)。
- 缺点:性能较直接调用差、可读性弱、破坏封装风险更高。
22. 注解(Annotation)常见用途?
答:
- 生成文档(如
@Override)。 - 编译检查。
- 运行时配合反射做框架配置(IOC、AOP、参数校验等)。
23. 线程和进程的区别?
答:
- 进程是资源分配的基本单位。
- 线程是 CPU 调度的基本单位,同进程线程共享堆和方法区等资源。
24. synchronized 和 volatile 的区别?
答:
volatile保证可见性和有序性,不保证原子性。synchronized保证可见性、有序性和原子性(通过互斥锁)。
一句话:volatile 适合状态标记,synchronized 适合临界区保护。
25. sleep() 和 wait() 的区别?
答:
sleep()是Thread的静态方法,不释放锁。wait()是Object方法,必须在同步块中调用,调用后释放锁,等待notify/notifyAll唤醒。
面试快答模板(30秒版)
如果面试官让你简述“Java基础能力”,可以这样答:
Java 基础我会从四块来回答:
第一是语言核心,比如面向对象、重载重写、equals/hashCode、字符串与异常体系;
第二是集合框架,重点是ArrayList、HashMap的底层机制和选型;
第三是泛型、反射、注解这些框架基础能力;
第四是并发入门,包括线程模型、synchronized/volatile、wait/sleep区别。
这些问题我不仅能解释概念,也能结合真实场景给出选型和避坑点。
总结
基础篇最重要的是:
- 不只记概念,要能说“为什么这样设计”。
- 不只会定义,要能说“实际怎么选型”。
- 不只会背答案,要能接住“追问”。
把这 25 题讲顺,Java 基础面试的通过率会明显提高。