准备Java面试,我整理了一份高频考点清单
我把这份Java面试高频考点清单打印出来贴在显示器边框上。每个考点旁边我都用红笔标了问号——那是被面试官追问到沉默的次数。第一次整理时我以为它是一份“背诵提纲”后来才明白Java面试清单不是用来背的是用来照见自己盲区的镜子。清单上的知识点每一个都能延伸出底层原理、项目实践和设计权衡。这篇文章我就把这份清单摊开讲讲每个考点背后面试官到底在找什么样的候选人。先看集合框架。清单里第一行就是HashMap这不是巧合。HashMap是Java面试的门神连它都说不清的面试者通常在初筛就被划掉。别急着背源码。面试官问“HashMap的put流程”其实想听你从hash计算、数组下标定位、链表/红黑树转换、扩容几个维度讲清楚。你要能说出为什么负载因子是0.75为什么树化阈值是8为什么并发下会丢数据。这些数字背后是空间时间权衡是泊松分布是CPU缓存行。如果有余力再对比一下ConcurrentHashMap的锁粒度演进。集合框架从背诵到理解集合框架里ArrayList和LinkedList也是高频对比题。很多人张口就是“数组和链表的区别”但面试官追问一句“你的ArrayList在循环里删除为什么抛ConcurrentModificationException”就懵了。回答集合框架最忌讳把源码从头背到尾。你需要理解抽象背后的设计哲学快速失败机制是为了尽早暴露bugRandomAccess接口是为了让Collections.binarySearch选择不同的遍历方式。把每个集合的底层存储结构和适用场景连起来形成一张决策树面试时自然不会被绕晕。再看并发的部分。如果说集合框架是Java的入门礼那并发编程就是区分初、中、高级工程师的试金石。清单里synchronized、volatile、CAS、AQS、线程池每一项都能单独出半小时的深挖题。你发现没有面试官很少让你背锁的升级过程他们更喜欢抛出一个场景“两个线程同时往一个Map里写会发生什么?”你如果只答“会丢数据”那就只能得到一句“然后呢”。并发编程不是看你用过多少锁而是看你能不能在没有锁的世界里讲清楚内存可见性。volatile的可见性是靠内存屏障实现synchronized的互斥是靠monitor对象CAS的乐观锁靠的是CPU原子指令——只有把这些底层机制串起来你才真正理解了并发工具箱里的每一件工具。并发编程工程师层次的试金石线程池是另一个必考重地。核心线程数、最大线程数、阻塞队列、拒绝策略这些参数背起来很容易但面试官只要换一个问法就击穿大半“如果你用的线程池核心线程数是10最大是20队列容量是30现在来了50个任务会发生什么?”你能立刻算出哪些任务立即执行、哪些进队列、哪些触发拒绝策略吗线程池参数背得再熟不如回答一个“当任务队列满了会发生什么”。还要警惕隐藏考点线程池里的线程在空闲时会怎样keepAliveTime对核心线程生效吗这些问题都在考验你是否真的读过ThreadPoolExecutor的源码而不是只看过八股文。当你把并发搞明白迎接JVM这关时难度又上了一个台阶。JVM考点清单通常包括内存区域、垃圾回收算法、类加载机制、调优命令。很多候选人能熟练画出运行时数据区能背诵Minor GC和Full GC的区别也能报出一串JVM参数但面试官淡淡一句“你生产环境的服务为什么CPU飙高”就哑火。JVM面试最怕的不是不懂算法而是把垃圾回收算法背得滚瓜烂熟却回答不了“你的服务为什么会Full GC”。你需要从对象分配、逃逸分析、TLAB、safepoint这些机制说起再配合jstat、jmap、jstack这些工具的实际操作。准备好一个真实的排查案例比背十篇网文都管用。JVM性能调优的底气类加载机制也是高频区。面试官问“双亲委派是什么”你答“父加载器优先”只能得个及格分。他们真正关心的是你理解OSGi吗为什么要打破双亲委派Tomcat的类加载器和JDBC的SPI有什么不同把类加载过程想象成一场“信任链”的辩论你才能答好为什么Java要如此严格地隔离类的身份。同样JVM内存模型JMM不是JVM内存区域很多人混为一谈。JMM解决的是多线程下的可见性和重排序问题是并发章节和JVM章节的交叉考点值得专门画一张图。从JVM回到应用层Spring是绕不开的大山。面试清单上IOC、AOP、Bean生命周期、事务传播机制、循环依赖每一行都是被问烂了的题。但你有没有发现面试官早就从“什么是IOC”进化到“Spring的BeanFactory和FactoryBean有什么区别”“Bean的实例化用了哪些扩展点”。Spring面试的终极心法把Bean的生命周期画成时间轴记性再差也能答出七八成。从BeanDefinition合并、实例化、属性填充、初始化前的BeanPostProcessor、InitializingBean到代理创建和销毁任何一个环节都能展开成一道深度题。SpringJava生态的骨架Spring循环依赖是近几年的高频考点因为它同时涉及IOC容器设计、三级缓存、AOP代理创建顺序。很多候选人知道“三级缓存”但不知道为什么需要三级而二级不够。如果你能解释“循环依赖的关键是把代理对象的创建延后到初始化之后”面试官的表情会明显不一样。事务传播机制同样如此不要只背PROPAGATION_REQUIRED这些枚举名要能结合嵌套事务、自调用失效的场景说明为什么Spring默认的传播行为是REQUIRED。数据库访问层的问题往往接在Spring后面。MySQL是Java面试的重头戏因为它是大多数公司的存储底座。清单里最常出现的考点是索引、事务隔离级别、MVCC、SQL调优。MySQL考的不是SQL语法而是你能否解释清楚一条慢SQL为什么慢。你需要理解B树的叶子节点有序链表联合索引的最左前缀原则覆盖索引为什么能避免回表以及索引下推是怎么减少回表次数的。别小看这些术语它们直接决定你是会“用索引”还是会“建索引”。MySQL索引与事务的“最后一公里”索引不是越多越好这条反常识的结论往往是面试加分项。因为每次insert/update都要维护所有二级索引所以索引数量带来的是写入成本的线性上升。索引不是越多越好每次写操作都要为所有索引买单能用普通索引绝不用唯一索引能用组合索引绝不用单列索引。更深入一点你可以聊聊change buffer对二级索引的优化以及为什么唯一索引无法使用change buffer。这些细节比背“最左前缀”更能打动面试官。事务隔离级别是另一个必考项。MySQL默认Repeatable Read但很多人不理解它怎么用MVCC实现快照读和当前读。你需要讲清楚undo log里的版本链、Read View的生成规则以及为什么RR下幻读没有被完全解决当前读仍有幻读问题。事务隔离级别考点的高阶表达是你能解释“MVCC解决了快照读的幻读但Next-Key Lock解决了当前读的幻读”一句话把两套机制拼接起来面试官就会知道你是真懂。Redis缓存不是万能药缓存中间件里Redis是绝对主角。考点清单包括五种基本数据结构、持久化RDB/AOF、缓存穿透/击穿/雪崩、分布式锁。准备这部分时别只顾着列命令要理解底层编码。比如string的int/embstr/raw三种编码list的quicklisthash的ziplist和hashtable回答时能顺带说出切换条件立刻显得有源码阅读功底。Redis面试标准答案缓存穿透要布隆过滤器缓存空值但真正到了生产环境你需要先想清楚谁在打你的缓存。恶意攻击、代码bug、缓存失效时间设置的疏漏都需要针对性地设计防护。缓存一致性是分布式系统的经典难题。面试官常问“先更新数据库还是先删Redis”答案不是固定的但你需要权衡二种方案的风险提出binlog订阅、消息队列最终一致性等解决思路。缓存一致性问题没有银弹但说出推拉结合和重试补偿至少证明你趟过坑。这种开放性问题考察的不是标准答案而是你面对不确定性时的分析范式。网络、设计模式与微服务基础网络知识里TCP三次握手四次挥手、HTTP状态码、HTTPS握手流程都是清单常客。这类题背起来容易真正考验的是你能不能用它解释真实问题。比如“为什么TCP要三次握手两次不行吗”答案是防止历史重复连接初始化“为什么挥手要四次”因为关闭连接需要半关闭状态。网络协议面试的漂亮回答不是背报文而是画出状态机讲出超时和重传的边界条件。设计模式方面单例、工厂、策略、模板、代理是最高频的五种。面试官会问“你在项目里怎么用策略模式消除if-else”这类问题逼着你从项目里找真实案例而不是背定义。微服务和分布式是高级Java岗的必考区。服务注册发现、配置中心、网关、熔断限流、分布式事务、幂等设计每一块都对应着可落地的组件。面试时大部分候选人讲得头头是道但连“缓存和数据库一致性”都没自己动手实现过。所以准备分布式不要只记概念。你至少要在纸上画出一次订单请求从负载均衡到数据库的完整调用链标出哪些环节可能出现重复请求哪些环节需要分布式锁哪些数据需要最终一致性。把场景讲具体比罗列十个微服务名词更有说服力。这份清单越往后延伸越逼近一个事实Java面试的核心不是知识点的广度而是思考的深度。你背熟的HashMap原理可能在第二面就被替换成“如果让你设计一个线程安全的HashMap你会怎么做”。把考点清单翻烂也换不来offer把每个考点背后的“为什么”想透面试官才会把你当作同行。哪怕下一次面试问到清单之外的问题只要你养成了这种追问到底的习惯就能从底层逻辑推导出答案。那时这份清单才真正完成了它的使命。