Java后端面试八股文大全(2025最新版)
一、Java基础篇
1. HashMap底层原理
经典回答:HashMap采用数组+链表+红黑树结构,默认初始容量16,负载因子0.75。当链表长度>8且数组长度≥64时转为红黑树。JDK8优化了hash算法:(h = key.hashCode()) ^ (h >>> 16)
。扩容时newCap = oldCap << 1,元素要么在原位置,要么在原位置+oldCap。
2. ConcurrentHashMap线程安全实现
标准答案:JDK7使用分段锁(Segment继承ReentrantLock),JDK8改为synchronized+CAS:
-
putVal时对数组元素加锁
-
size()采用baseCount+CounterCell分段统计
-
扩容时协助迁移(多线程协同)
二、JVM篇
3. 对象内存布局
八股模板:
4. G1垃圾回收器
背诵要点:
-
分区算法(Region大小1-32MB)
-
四种GC模式:Young GC、Mixed GC、Full GC、并发标记
-
SATB解决并发标记漏标问题
-
推荐场景:堆>6GB,停顿时间<500ms
三、并发编程篇
5. AQS实现原理
标准话术:
-
核心字段:state(volatile)、head/tail(CAS更新)
-
ConditionObject实现条件等待
6. ThreadLocal内存泄漏
标准答案:
-
Key泄漏:ThreadLocal弱引用被回收,但Value强引用仍在
-
根本原因:线程池场景下线程长期存活
-
解决方案:1) 及时remove() 2) 使用static final修饰
四、Spring篇
7. 循环依赖解决
Spring标准回答:
三级缓存解决setter注入循环依赖:
-
一级缓存:singletonObjects(完整Bean)
-
二级缓存:earlySingletonObjects(早期引用)
-
三级缓存:singletonFactories(ObjectFactory)
构造器注入无法解决,需改用@Lazy
8. Spring事务失效场景
排查清单:
-
非public方法
-
同类方法调用(未走代理)
-
异常类型不匹配
-
多线程调用
-
数据库引擎不支持(如MyISAM)
五、数据库篇
9. MySQL索引优化
B+树标准回答:
-
聚簇索引:叶子节点存整行数据(主键索引)
-
非聚簇索引:叶子节点存主键值(需要回表)
-
索引失效场景:1) 函数操作 2) 隐式转换 3) 前导模糊查询 4) 范围查询阻断
10. MVCC实现原理
InnoDB标准答案:
-
隐藏字段:DB_TRX_ID(事务ID)、DB_ROLL_PTR(回滚指针)
-
ReadView:m_ids(活跃事务)、min_trx_id、max_trx_id
-
判断规则:trx_id < min_trx_id可见,trx_id > max_trx_id不可见
六、分布式篇
11. Redis持久化对比
标准对比表:
方式 | 触发机制 | 数据安全性 | 恢复速度 | 性能影响 |
---|---|---|---|---|
RDB | 定时/save命令 | 低 | 快 | 高 |
AOF | 每条写命令 | 高 | 慢 | 低 |
混合 | RDB+AOF | 中高 | 中等 | 中等 |
12. CAP理论应用
标准解释:
-
CP系统(Zookeeper):网络分区时拒绝写入
-
AP系统(Eureka):网络分区时返回旧数据
-
实际选择:1) 支付系统选CP 2) 商品系统选AP
七、场景设计篇
13. 短链系统设计
标准架构:
-
发号器:Snowflake(64位ID)
-
转码:Base62(0-9a-zA-Z)
-
存储:Redis缓存+MySQL持久化
-
跳转:302临时重定向
-
统计:Redis HyperLogLog
14. 秒杀系统设计
标准方案:
-
分层削峰:静态化->网关限流->队列缓冲
-
库存扣减:Redis Lua脚本原子操作
-
防刷:令牌桶限流+风控规则
-
降级:排队页+异步通知
八、HR问题篇
15. 职业规划标准答案
三段式模板:
-
短期(1年):深耕技术栈(如Spring Cloud Alibaba)
-
中期(3年):提升架构能力(主导系统重构)
-
长期(5年):技术管理双通道(TL或架构师)