好的,以下是一份结构清晰的 Java 常见面试题及答案汇总(2025 最新版),涵盖基础、进阶、新特性和实战场景:
一、Java 基础
1. 面向对象三大特性
答:
- 封装:隐藏内部实现,提供公共访问方式(如 private 属性 + getter/setter)。
- 继承:子类复用父类属性和方法(extends),支持单继承。
- 多态:同一方法在不同对象中有不同实现(通过方法重写 + 父类引用指向子类对象)。
2. == 和 equals() 的区别
答:
- ==:比较基本类型的值或引用类型的内存地址。
- equals():默认比较地址(与 == 相同),但可被重写(如 String 比较内容)。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)
3. String、StringBuilder、StringBuffer 区别
答:
- String:不可变类,每次操作生成新对象。
- StringBuilder:可变,线程不安全,性能高。
- StringBuffer:可变,线程安全(synchronized),性能较低。
场景:单线程用 StringBuilder,多线程用 StringBuffer。
二、集合框架
4. HashMap 原理
答:
- 结构:数组 + 链表/红黑树(JDK 1.8+)。
- 哈希冲突:通过链表或树化解决。
- 扩容:默认容量 16,负载因子 0.75,扩容时重新散列。
- 线程安全:非线程安全,可用 ConcurrentHashMap 替代。
5. ConcurrentHashMap 如何保证线程安全?
答:
- JDK 1.7:分段锁(Segment)。
- JDK 1.8+:CAS + synchronized(锁单个桶),降低锁粒度。
三、多线程
6. 线程的创建方式
答:
7. synchronized 和 ReentrantLock 区别
| 锁机制 | JVM 内置锁 | API 实现(java.util.concurrent) |
| 可中断 | 否 | 是(lockInterruptibly()) |
| 公平锁 | 非公平 | 可配置公平/非公平 |
| 条件变量 | 单一 wait()/notify() | 多 Condition |
四、JVM
8. 垃圾回收算法
答:
- 标记-清除:产生碎片。
- 复制算法:空间利用率低(年轻代)。
- 标记-整理:减少碎片(老年代)。
- 分代收集:年轻代(Minor GC) + 老年代(Full GC)。
9. 类加载过程
答:
五、新特性(Java 17~21)
10. record 类的作用
答:
- 简化不可变类的定义(自动生成 equals()、hashCode()、toString())。
public record User(String name, int age) {} // 自动生成构造器、Getter
https://weibo.com/tv/show/1034:5277251714088981
https://weibo.com/tv/show/1034:5277251663757348
https://weibo.com/tv/show/1034:5277251630202906
https://weibo.com/tv/show/1034:5277251596386360
https://weibo.com/tv/show/1034:5277251558899753
11. 模式匹配(instanceof 增强)
答:
- 直接提取对象属性:
if (obj instanceof String s) {
System.out.println(s.length()); // 直接使用 s
}
https://weibo.com/tv/show/1034:5277251714088981
https://weibo.com/tv/show/1034:5277251663757348
https://weibo.com/tv/show/1034:5277251630202906
https://weibo.com/tv/show/1034:5277251596386360
https://weibo.com/tv/show/1034:5277251558899753
12. 虚拟线程(Project Loom)
答:
- 轻量级线程:由 JVM 调度,非操作系统线程。
- 高并发:支持百万级线程(如 Thread.startVirtualThread())。
- 适用场景:I/O 密集型任务(如微服务、数据库访问)。
六、场景题
13. 如何避免死锁?
答:
14. Spring 事务失效场景
答:
- 方法非 public。
- 自调用(未通过代理)。
- 异常未被捕获(默认回滚 RuntimeException)。
- 多线程中事务不传播。
七、实战优化
15. MySQL 查询优化
答:
- 索引优化:避免全表扫描,覆盖索引。
- 分页优化:where id > ? limit 替代 limit offset, size。
- 避免 SELECT *,减少数据传输。
16. 分布式 ID 生成方案
答:
- UUID:简单但无序。
- 雪花算法(Snowflake):时间戳 + 机器码 + 序列号。
- 数据库自增:分片下通过步长隔离(如 1,3,5… 和 2,4,6…)。
- Redis 原子操作:INCR。
提示:面试时需结合项目经验,用 STAR 法则(情境、任务、行动、结果)阐述解决方案。持续关注 Java 新版本特性(如 Valhalla 值类型、Panama 外部函数)是加分项!


