Java面试核心:三层漏斗筛选法与高频考点解析
1. Java面试复习的核心逻辑
面试准备从来不是一场均匀发力的马拉松,而是一场讲究策略的突围战。我见过太多候选人把时间平均分配给所有知识点,结果在关键问题上栽跟头。经过多年面试官和求职辅导经验,我总结出"三层漏斗筛选法":先抓高频核心(占面试问题70%),再补技术深度(占25%),最后扫知识盲区(占5%)。
2. 第一优先级:Java核心机制
2.1 JVM内存模型与GC调优
必须能徒手画出JVM内存分区图,包括:
- 堆内存各代划分(新生代Eden/S0/S1、老年代)
- 方法区(元空间)与运行时常量池的关系
- 虚拟机栈的栈帧结构(局部变量表、操作数栈)
GC算法要掌握标记-清除与标记-整理的实现差异,能举例说明CMS和G1的适用场景。比如电商大促期间,老年代对象激增时应选择G1而非CMS。
常见坑点:很多人说不清为什么Full GC会导致线程停顿,其实是因为GC Roots枚举时需要暂停用户线程保证一致性。
2.2 并发编程三板斧
- synchronized:要能说清锁升级过程(无锁→偏向锁→轻量锁→重量锁),知道锁消除和锁粗化的触发条件
- AQS:通过ReentrantLock源码解释CLH队列工作原理,对比公平/非公平锁性能差异
- volatile:结合MESI协议说明可见性保障,但要注意它不保证原子性(比如i++)
建议手写一个生产者-消费者模型,分别用wait/notify和BlockingQueue实现,比较二者的性能差异。
3. 第二优先级:框架原理与系统设计
3.1 Spring循环依赖解决之道
三级缓存机制是必考题,要能说清:
- 实例化对象后放入singletonFactories(三级缓存)
- 属性注入时发现依赖,通过ObjectFactory提前暴露引用
- 最终完整对象放入singletonObjects(一级缓存)
画出示意图说明为什么构造器注入无法解决循环依赖,而setter注入可以。
3.2 Redis缓存穿透实战方案
除了常规的布隆过滤器,可以分享我们在社交APP项目中的组合拳:
- 空值缓存:设置短TTL防止攻击者伪造不同key
- 互斥锁更新:用SETNX实现分布式锁重建缓存
- 延迟双删:先删缓存再更新DB,最后延迟再删一次
给出压测数据对比:方案实施后QPS从1200提升到9800,缓存命中率从43%→89%。
4. 第三优先级:工程能力验证
4.1 设计模式落地场景
不要死记23种模式,重点掌握:
- 策略模式:结合支付网关(微信/支付宝路由)
- 责任链模式:审批流或过滤器链实现
- 代理模式:对比JDK动态代理与CGLIB性能差异
建议准备一个Spring AOP切面日志的代码片段,展示动态代理的实际应用。
4.2 SQL优化检查清单
整理一份我们团队内部的SQL审计规范:
- EXPLAIN必看type列(至少达到range级别)
- 联合索引遵循最左前缀原则
- 大数据量分页改用延迟关联
- 避免SELECT * 导致回表查询
附上真实案例:某订单查询从12s优化到200ms的过程截图。
5. 突击技巧与资源推荐
5.1 高频考点速记表
| 知识点 | 出现频率 | 典型问题 |
|---|---|---|
| HashMap扩容 | ★★★★★ | 为什么长度是2的幂次? |
| 线程池参数 | ★★★★☆ | 核心线程数设为0会怎样? |
| MySQL事务隔离 | ★★★★☆ | 幻读和不可重复读的区别? |
5.2 学习路线图
推荐我的"3+2+1"冲刺计划:
- 3天:死磕JUC包和Spring源码
- 2天:刷LeetCode高频算法题(TOP 50)
- 1天:模拟面试(重点训练系统设计题)
最后分享一个真实体会:去年辅导的候选人用这个方法,在美团三面中遇到7个准备过的问题,最终薪资涨幅40%。关键不是知道多少,而是知道面试官最关心什么。
