备战Java面试:核心知识点梳理

📅 2026/7/4 20:09:09
备战Java面试:核心知识点梳理
别再刷题了Java面试考察的是底层逻辑面试官问“HashMap为什么线程不安全”时他不是想知道你背出的答案而是想看你能否从扩容机制、多线程环境下数据覆盖、死循环的概率推导出一条完整的逻辑链。很多候选人把Java面试当成一场“背诵大赛”却忘了真正决定你能否通过的是对核心知识点的理解深度。今天这篇梳理我会直接拆解面试中最常出现的几大领域把那些“本以为会了却说不透”的点讲明白。如果你准备好接受一次认知升级那就从现在开始。一、JVM别只知道“堆栈方法区”面试官要看你的调优能力JVM调优永远不是“背参数”。很多人的简历写着“熟悉JVM性能调优”面试时却连OOM的几种类型都说不全。正确的打开方式是先从运行时数据区域入手明确堆空间是GC关注的核心区域而方法区是非堆区域。你至少要知道新生代和老年代的比例默认是1:2Eden和Survivor的比例是8:1。面试官接着会问“哪些对象会进入老年代”这时你可以从年龄阈值默认15、动态年龄判断、空间分配担保机制三条线展开。如果只回答“大对象直接进入老年代”说明你只看了《深入理解Java虚拟机》的目录。GC日志是面试官检验你真实水平的利器。当你看得懂“146.279: [GC (Allocation Failure) — 1024K-512K(2048K), 0.0034567 secs]”时才敢说理解了Minor GC、Major GC和Full GC的区别。更关键的是你要能根据日志推导出Young GC触发频率过高、老年代增长过快的原因并给出“增大新生代空间”或“调整晋升阈值”的具体建议。最后的压轴问题往往是“垃圾收集器选型”。别再只背CMS和G1的优缺点现在面试官更关注ZGC在低延迟场景下的优势。如果你能说出ZGC的染色指针和读屏障如何实现平均毫秒级别的停顿你已经超过了95%的候选人。二、并发编程从JMM到锁的进阶之路并发是Java面试的“分水岭”。基础题问“volatile关键字的作用”高级题问“单例模式的DCL为什么要用volatile修饰”。问题的核心在于JMMJava内存模型的“可见性”和“有序性”两个基本语义。volatile通过内存屏障禁止指令重排序同时保证写操作对其他线程立即可见这是解决DCL问题的关键。但很多人忽略了内存屏障在x86平台上的实现是StoreLoad屏障因为CPU架构不同平台依赖可能带来性能差异。这种细节才真正体现工程思维。接下来是synchronized的底层原理。从重量级锁到偏向锁、轻量级锁的膨胀过程是必考。JDK6之后为了减少锁竞争带来的开销JVM引入了锁升级机制。你要能画出从无锁→偏向锁→轻量级锁→重量级锁的转换流程以及每个阶段的Mark Word结构变化。面试官通常还会追问“为什么偏向锁在高并发场景下反而会成为性能瓶颈”答案是当锁被多次争用时偏向锁的撤销需要全局安全点stw反而加重了几微秒的停顿。AQS抽象队列同步器同样是高频考点。ReentrantLock的公平与非公平实现区别在于非公平锁直接尝试CAS获取而公平锁会检查队列中是否有前驱节点。但更深的是你要理解Condition接口的await和signal是如何与AQS的同步队列结合实现的。AQS把阻塞线程包装成Node节点挂入CLH变种队列通过CAS和自旋保证了高效的无锁入队。CountDownLatch、CyclicBarrier、Semaphore的区别CountDownLatch是一次性的门闩CyclicBarrier可以循环使用Semaphore控制信号量的资源数。面试官如果让你设计一个限流组件你能否迅速联想到Semaphore定时重置三、集合框架从源码到设计的思考ArrayList扩容机制属于送分题但再深入一步就显出了差距为什么ArrayList的扩容因子是1.5而不是2答案是JVM的优化——数组复制时的内存对齐以及减少扩容次数与内存浪费的平衡。HashMap的负载因子0.75同样是为了平衡时间和空间复杂度。HashMap在JDK8的重大变化是引入红黑树优化链表过长导致的查询O(n)问题。但核心问题在于为什么链表长度超过8时才转红黑树官方注释给出的原因是泊松分布表明链表长度达到8的概率极低0.00000006且红黑树节点占用的空间是链表节点的2倍因此只在极端情况下转化。这个回答既展现了你对源码的理解也体现了计算机科学中的概率思维。ConcurrentHashMap是并发包里的明星。JDK7采用分段锁机制JDK8改用CASsynchronized锁定数组节点带来了更细粒度的并发控制。你必须知道CAS在put操作中的失败重试机制以及在扩容过程中如何通过ForwardingNode让并发线程协助迁移数据。TreeMap和LinkedHashMap的考察较少但如果你想冲击大厂就得理解红黑树的左旋和右旋如何保持平衡以及LinkedHashMap如何通过双向链表实现LRU缓存。阿里二面曾问过“手写一个LRU缓存要求O(1)时间复杂度”最高效的实现就是LinkedHashMap重写removeEldestEntry方法。这已经不是背代码了而是考察你对数据结构的组合运用能力。四、Spring框架IoC和AOP的本质以及循环依赖的终极解法Spring面试已经从“说说Ioc有什么好处”进化到了“三级缓存如何解决循环依赖”。答案的核心是Spring用singletonObjects一级、earlySingletonObjects二级、singletonFactories三级三个Map实现了对单例Bean的提前暴露。AOP的考察重点则是JDK动态代理和CGLIB代理的区别。很多候选人只知道“JDK代理需要接口CGLIB不需要”但面试官真正想听的是性能对比JDK1.8之后JDK动态代理性能已经不亚于CGLIB且CGLIB底层用ASM生成子类需要额外加载类存在一定开销。如果能接着说出Spring AOP默认策略是“如果目标类实现了接口采用JDK代理否则采用CGLIB代理”那才算是答全了。事务管理是CRUD基础能力的分水岭。Transactional的失效场景你一定得背透private方法、自调用this.method()、没有被Spring管理、方法内部捕获异常但未抛出RuntimeException、传播属性配错等。一个常考的变体是如果事务方法A调用事务方法B默认REQUIRED传播B抛出异常且A捕获异常后不抛事务会怎样答案是A和B都在同一个事务中异常被A吞掉后事务提交时不抛异常但Spring默认回滚规则是RuntimeException如果B抛的是自定义的RuntimeException且A捕获后未重新抛出事务管理器认为没有异常最终不会回滚。这个案例能暴露出很多“以为自己懂事务”的人。五、MySQL从索引到锁再到优化实战面试官问“你的项目数据库慢查询怎么排查”大多数人的回答是“看慢查询日志explain分析”。但挖掘深度在于你能从explain的结果中读出type、key、rows、Extra几个字段的含义吗typeALL是全表扫描typerange是范围扫描typeref是非唯一索引等值匹配typeconst是主键/唯一索引常量查询。rows的估值通常不准确但Extra中出现Using filesort或Using temporary往往意味着需要索引优化。MySQL索引最左前缀原则是常识但面试官会问“如果我把索引(a,b)的字段顺序调转对查询有什么影响”你需要根据查询条件中的where顺序来推导如果where a1 and b2无论索引顺序是(a,b)还是(b,a)都能用到索引因为优化器会重写条件。真正决定顺序的是选择性distinct值/总行数较高的列放左边可以减少扫描范围。InnoDB的行锁和间隙锁是一线开发常常踩坑的地方。间隙锁导致死锁的典型案例事务A执行update user set namex where id5如果id5不存在InnoDB会锁住id5和下一个记录之间的间隙事务B插入id5就会等待如果两个事务相互等待间隙锁就可能形成死锁。正确做法是使用唯一索引或者调整事务隔离级别至READ COMMITTED在RC级别下间隙锁会失效。当然RR级别是MySQL默认级别如果要修改需要评估业务场景。分库分表也是高频题。ShardingSphere和MyCat的区别不在于使用方式而在于前者是客户端分片后者是代理层分片。设计分片键时应选择查询频率最高的字段作为分片键避免跨节点查询。如果出现热点数据可以考虑“表分区分区键哈希再均衡”。中级工程师能说清楚这些就已经合格了。六、Redis不只是缓存更是数据结构服务器Redis的五大基本类型面试面试官越来越喜欢追问底层实现。比如你有没有想过String类型的底层到底是int、embstr还是raw答案取决于value字符串的长度小于44字节用embstr一次性分配内存大于44字节用raw分两次分配。Set类型虽然基于Hash实现但元素值全为null这一点很多人不知道。ZSet的跳跃表结构更是必考为什么用跳跃表而不用平衡树原因在于跳跃表的范围查询比红黑树更快双向链表多级索引且实现简单。持久化策略是Redis高可用的基础。RDB是全量快照AOF是追加写日志。面试官会问你“如果Redis宕机重启数据怎么恢复” 你应该能回答出AOF重写机制当AOF文件体积超过阈值时Redis主进程fork一个子进程执行BGREWRITEAOF生成一个新的仅包含最小指令集的AOF文件。但要注意AOF重写期间主进程仍然在接收写入新的写命令会被存入缓冲区在子进程结束后合并到新AOF文件中。这个细节很多人不知道。Redis的过期策略和内存淘汰机制是面试必备组合。定期删除惰性删除是默认策略但如果过期key堆积过多会导致内存暴涨这时候就由淘汰策略出手allkeys-lru是绝大多数业务的推荐配置但你需要理解lru算法本身的局限性——如果一个key被频繁访问但体积巨大可能更快地占满内存而volatile-ttl策略则会优先淘汰剩余时间短的key。Redis8.0版本引入了LFU最不经常使用策略更适用于热点数据较少、访问频率差异大的场景。七、分布式核心CAP、一致性协议与微服务陷阱分布式是Java高级岗位的必考领域。CAP理论的核心不是“三选二”而是P分区容忍性是必选项你只能在C和A之间做权衡。不同的系统有不同的选择ZooKeeper保证CP强一致性写操作半数确认后才返回Eureka保证AP高可用每个节点独立保存注册表允许短暂不一致。但很多候选人被问到“你的项目为什么选择ZooKeeper而不是Eureka”时只会回答“ZooKeeper是CPEureka是AP”却说不清业务场景对一致性的依赖程度。一致性协议方面Paxos和Raft的区别在于Raft是更容易工程化的强 Leader 算法。面试官大概率会问“你了解Raft的Leader选举过程吗” 你要能说出任期term、候选者、投票规则、多数派、心跳机制。如果还能提到“Raft的日志复制是强一致性的只有Leader确定日志被半数节点复制后才返回客户端”你就是这个问题的满分答案。微服务架构的最后防线是分布式事务的几种解决方案2PCXA协议性能极差TCCTry-Confirm-Cancel需要业务代码侵入可靠消息最终一致性基于RocketMQ事务消息是电商场景最常用的方案最大努力通知适用于支付回调等非关键链路。面试官想听的是你如何在项目中选择技术高并发场景下优先保证可用性使用最终一致性银行转账场景只能用强一致性的2PC或者Seata AT模式。八、算法与数据结构刷200道题不如精通五类模板Java面试中的算法题通常不会让你实现红黑树或者B树但LeetCode频率最高的Top 100题你必须熟练掌握。尤其注意以下五类模板链表操作快慢指针找中间节点、反转链表、环形链表检测、二叉树遍历递归与迭代互转、层序遍历、最近公共祖先、动态规划爬楼梯、最大子序和、背包问题、回文子串、排序快速排序、归并排序并能写出非递归版本以及哈希表冲突处理。算法的核心不是死记硬背而是套路遇到“子序列/子数组”问题优先考虑滑动窗口或双指针遇到“最短路径/最小代价”问题优先考虑BFS或Dijkstra遇到“所有解”问题考虑回溯剪枝优化。面试官常出的变体题”找出数组中所有重复的数字要求空间复杂度O(1)”——这题不能用哈希表只能用数组下标与元素值的映射来交换位置本质是鸽巢原理的应用。时间复杂度分析一定要写在代码注释里面试官不但看你的编码能力更看你的计算思维。如果你能同步说出“这个解的时间复杂度是O(n)空间复杂度是O(1)因为用到了常数额外变量”就已经体现了工程化思维。九、项目经验别讲流水账要讲你的决策逻辑面试中最大的杀手不是知识点不会而是项目经验讲得毫无起伏。很多人都犯一个错误从需求背景、技术栈、团队规模讲到上线结果全都是叙述没有自己的技术决策。面试官想听的是你当时遇到了什么困难你有几种方案你选择了一种方案理由是性能更好/成本更低/更易于维护比如你做秒杀系统你说“我们用了Redis预减库存”那么你面临的问题就是“库存扣减的原子性如何保证”你可以讲Lua脚本原子执行、还是Redis事务、还是分布式锁。你的选择背后的逻辑就是你的价值。一定要在你的项目中挖掘出至少三个技术难点比如接口幂等性如何实现Redis tokenDB唯一索引、热点数据如何缓存热key监控本地缓存兜底、系统如何应对突发流量限流计数器、漏桶、令牌桶。这些才是面试官打分的核心依据。最后一个技巧永远不要在面试中否定自己的系统比如“我们没做分布式锁所以偶尔超卖”“我们的缓存没做失效时间导致数据不一致”。正确的说法是“我们当时在设计时也考虑过分布式锁但评估后认为业务对及时性要求较低所以采取了乐观锁重试机制虽然偶尔有超卖但概率极低整体可接受”。这样既诚实又展现了成熟的工程判断。十、面试备战最终策略以“知识树”对抗“遗忘曲线”你读到这里可能已经头晕这些知识点不是一天就能记住的。正确的做法是把每个领域画成思维导图每天复习一个分支模拟面试时讲给自己听。讲给别人听会被打乱节奏但讲给自己你可以随时停下来查阅资料直到能流畅地复述出来。刷题比背知识点更重要。算法题每天两题LeetCode上的《剑指Offer》和《程序员面试金典》是必刷。框架源码必须看过至少核心类的5个关键方法比如HashMap的put和get方法Spring的refresh方法MyBatis的sqlSessionTemplate。如果你只有两周备战时间那么全力攻三个方向JVM、并发编程、数据库这三者占面试题的60%以上。最后一个提醒面试是双方向的筛选过程。你在被面试的同时也在评估这家公司的技术氛围和业务前景。如果面试官一直问超出你经验范围的问题不必紧张那不是你的问题。你要做的就是在面试中展现出你对技术本质的刨根问底精神。这样即使这次没有拿到Offer面试官也会对你留下“有潜力”的印象。现在关掉这篇文章打开IDEA从手写一个线程安全的单例模式开始吧。