以下是 2025 年最新 Java 面试题合集,涵盖基础、进阶、多线程、集合、JVM 等关键方向,附精炼答案,堪称全网最全、最细版本。
✅ 基础篇
1. Java 是什么?与平台独立如何实现
答:Java 是一种平台无关、面向对象、具备自动内存管理(GC)和丰富标准库的语言。通过编译成字节码运行在 JVM 上,实现 “一次编写,处处运行” (blog.csdn.net)。
2. 基本类型 vs 对象
答:基本类型(如 int
)存储实际值,内存占用小,速度快,不能为 null;对象存储引用,功能强,但占用更多空间且可为 null 。
3. String、StringBuilder、StringBuffer 区别
答:
String
不可变,适用于少量拼接;StringBuilder
可变,非线程安全,高效;StringBuffer
可变,线程安全,但稍慢 (datacamp.com)。
4. ==
vs equals()
答:
==
比较的是引用地址;equals()
比较的是对象内容(需按需重写)(blog.csdn.net)。
5. static 关键字
答:用于声明属于类而非实例的成员,常用于共享状态或工具函数 。
🧠 进阶篇
6. JDK、JRE、JVM 区别
答:
- JVM:执行字节码的虚拟机;
- JRE:包含 JVM、核心类库;
- JDK:包含 JRE+开发工具(如编译器、调试器)(rasathuraikaran26.medium.com)。
7. 重载 vs 重写
答:
- 重载:同类中方法名相同、参数不同,编译时多态;
- 重写:子类提供父类同签名方法实现,运行时多态 (blog.csdn.net)。
8. 访问修饰符含义
答:
public
:任何地方可见;protected
:包内及子类;- default(无修饰):包内;
private
:仅类内可见 (datacamp.com)。
⚙️ 并发 & 异常
9. Runnable vs Callable
答:Runnable
无返回值、有异常无法抛;Callable
有返回值,可抛异常,适合与 ExecutorService
搭配 。
10. 守护线程(Daemon Thread)
答:后台线程,主线程退出后也会随 JVM 退出,不应用于关键任务 。
11. Checked 和 Unchecked 异常
答:
- Checked 异常在编译期必须处理;
- Unchecked 是运行时异常,可不处理 (blog.csdn.net)。
12. throw vs throws
答:
throw
用于方法内部抛出异常;throws
用于方法声明,表示该方法可能抛出的异常 (datacamp.com)。
📚 集合框架
13. ArrayList vs LinkedList
答:ArrayList
随机访问快;LinkedList
插入/删除快,访问慢 。
14. HashSet vs TreeSet
答:HashSet
不排序、速度快;TreeSet
按自然顺序排序,性能相对慢 。
15. Fail-fast vs Fail-safe 迭代器
答:
- Fail‑fast(如 ArrayList、HashMap):遇修改抛
ConcurrentModificationException
; - Fail‑safe(如 ConcurrentHashMap、CopyOnWriteArrayList):对集合副本操作,不抛异常 (utho.com)。
🌐 Java 8 和函数式
16. Java 8 新特性
答:Lambda 表达式、Stream API、函数式接口、Optional、Date/Time API、方法引用等 。
17. Lambda 表达式
答:用来简化匿名内部类,适用于函数式接口,具备代码简洁、可读性强等优势 。
18. Stream API
答:用于对集合进行过滤、映射、聚合等操作,支持并行处理,延迟执行 。
19. Optional 作用
答:避免空指针,显式处理可能缺失的值 。
🧠 JVM & 性能优化
20. JVM 各内存区介绍
答:包括方法区、堆、栈、程序计数器、本地方法栈,用于不同用途 。
21. Stack vs Heap 区别
答:
- 栈:用于方法调用、局部变量;
- 堆:用于存放对象和实例变量,涉及 GC (utho.com)。
22. 内存泄漏举例
答:当不再使用的对象仍被引用(比如静态集合中大量元素)时,GC 无法回收,产生泄漏 。
🧩 其他常见问题
23. 单例模式写法(线程安全)
答:可用双重检查锁(Double-Checked Locking)、静态内部类(Bill Pugh 模式)等方式实现线程安全单例 。
24. 深拷贝 vs 浅拷贝
答:浅拷贝复制对象引用,深拷贝复制对象本身(包括内部对象)。
25. 不可变类设计
答:类声明为 final
,字段为 private final
且无 setter,通过构造器初始化,确保对象状态不可变 。
✅ 面试准备建议
- 结构化练习:基础 + 并发 + JVM + 框架;
- 代码实现:准备常见代码题(如单例、深拷贝);
- 结合场景:将知识点转为项目经验;
- 模拟问答:练习流畅表达,附加补充项目背景。
如果你想要 按经验分类的完整题库(初、中、高级)、包含 Spring、MyBatis、微服务等体系的问题清单与答案,也可以告诉我,我会进一步为你整理!
发表回复