ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

一份Java面试复习清单:覆盖集合、JVM与Spring

一份Java面试复习清单:覆盖集合、JVM与Spring 集合、JVM与Spring这三个词几乎就是Java面试的“三座大山”。你背过的那些八股文在真正的追问下不堪一击因为面试官要的不是答案而是你脑子里有没有那棵知识树。这份清单不是让你死记硬背而是帮你把碎片化知识重新焊接成一套能“扛住深挖”的思维框架。如果你只有三天时间请把所有精力放在这三件事上集合底层是数据结构与并发的镜子JVM是Java与操作系统之间的契约Spring则是你理解“工程化设计”的试金石。集合别再背源码去画数据结构图ArrayList和LinkedList的区别几乎每个面试者都能背出“数组 vs 链表”。但当你被问到“ArrayList在频繁删除元素时性能为何急剧下降而LinkedList就一定能赢吗”很多人会卡壳。真正的答案藏在“内存布局”和“局部性原理”里——数组在内存中连续CPU缓存友好而链表节点分散每次访问都可能触发缓存缺失。你画一张内存示意图比背十遍源码有效。面试官让你说HashMap原理如果你只是复述“数组链表红黑树”那么你只值五分。要说的是一棵红黑树插入时如何旋转、为什么树化阈值为8、为什么退化阈值是6以及负载因子0.75背后的“空间与时间的权衡”。甚至可以追问为什么用红黑树而不是AVL树因为红黑树牺牲严格平衡换取更少的旋转次数在写入频繁的场景更实用。这才是“有深度的理解”不是“背诵”。ConcurrentHashMap是并发题的分水岭。旧版用分段锁新版用CAS synchronized。面试官问“为什么JDK8还要用synchronized而不是完全CAS”答案很讽刺在高竞争场景下CAS自旋会造成严重的CPU浪费而synchronized在锁升级为重量级锁后会阻塞线程反而节省了CPU。更关键的是你要能画出“put”操作的全过程先算hash然后判断table是否初始化接着用CAS插入空桶如果桶不为空则锁住头节点再遍历链表或红黑树。很多人只记住“CAS synchronized”却忘了“协助扩容”和“ForwardingNode”这类细节。面试官只要轻描淡写地问一句“扩容时其他线程能继续put吗”就能卡掉八成候选人。你至少要知道读操作可以并发写操作如果遇到ForwardingNode会帮助迁移或等待。记住并发集合的核心是“让锁的粒度尽可能小甚至无锁”。JVM内存模型与调优是“操作系统课”的续集JVM面试题从“运行时数据区”到“垃圾回收器”几乎人人会背。但面试官最恨的就是“背完五块区域名字就停”的人。你讲堆、栈、方法区时能不能顺带说一句“栈是线程私有所以栈上的局部变量天然线程安全堆是线程共享所以需要同步机制”用这种“对比原因”的方式一秒拉开差距。紧接着是内存溢出问题栈溢出StackOverflowError通常因为递归调用太深而堆溢出OutOfMemoryError则是因为对象无法被回收或分配超大数组。如果你能现场画一个“对象出生在Eden区经历Minor GC后进入Survivor年龄到15后晋升老年代”的生命周期图并且解释为什么是15而不是7那么JVM基础分就拿稳了。垃圾回收是深水区。 G1回收器最核心的设计是“把堆分成多个Region用记忆集Remembered Set追踪跨Region引用从而避免全堆扫描。” 面试官如果问“CMS和G1有什么区别”你不能只说“CMS标记清除、G1标记整理”而要提到停顿预测模型——G1会预测每个Region回收后的停顿时间然后优先回收那些“回收收益最大”的Region。这种“可控停顿”的思想恰恰是Java服务端追求SLA的必备技能。更进一步你会不会被问到“什么是三色标记法为什么会产生漏标怎么解决”如果你能扯出“增量更新”和“原始快照SATB”的区别——CMS用增量更新G1用SATB——那就说明你真的读进去了。别恐慌“并发标记”阶段很可能出错但理解它比记住每个参数更有价值。调优层面的问题往往是“你遇到过线上内存溢出吗怎么排查”这时候最怕一句话回答“用jmap看了下堆”。你要给出完整路径先用jps定位进程再用jstat -gcutil看GC频率接着jmap -dump:formatb导出堆快照然后用MAT或VisualVM分析大对象或Dominator Tree。如果你能顺便提一句“我习惯在启动参数里加上-XX:HeapDumpOnOutOfMemoryError”面试官眼睛会亮一下。另一个角落是“类加载机制”。双亲委派模型的精髓不是“向上委派”而是“避免核心类被篡改”。但当面试官问“怎么打破双亲委派”你必须答出Tomcat的WebAppClassLoader——每个WebApp有独立类加载器为了隔离不同应用的类库版本以及JSP热更新时“丢弃旧的类加载器重新创建”。如果你能把“双亲委派”和“类加载隔离”这两个概念对立统一起来就证明你理解了框架设计者的苦衷。Spring核心不是AOP与IOC而是“依赖管理的哲学”Spring面试题永远是“什么是IOC什么是AOP”但说实话这两个概念背出来并不能让你突出。你要回答的是IOC容器本质上是一个“对象工厂依赖登记表”它改变了对象的创建时机和生命周期管理方式——对象不再由自己new而是由容器组装。更深一层DI依赖注入和IOC是同一件事吗严格来说IOC是思想DI是它的实现方式之一。面试官想听到的是你有“概念辨析”能力。但光有思想还不够你必须能说清Bean的生命周期实例化、属性填充、BeanNameAware回调、BeanPostProcessor的前置处理、InitializingBean和init-method、BeanPostProcessor的后置处理、使用、销毁。如果只记得“构造、初始化、销毁”那你连及格都难。 Spring容器最骚的操作其实就是BeanPostProcessor它能让你在Bean初始化前后“劫持”一番Spring的各种注解驱动、代理生成全部藏在这里。AOP部分经常有人把“切面、切点、通知”背得滚瓜烂熟。但一问“Spring AOP是运行时代理还是编译时织入”就糊涂了。默认是运行时代理接口用JDK动态代理类用CGLIB子类代理。你还可以进一步说明“为什么JDK代理必须基于接口”因为Proxy.newProxyInstance会生成一个实现接口的代理类它只能通过接口暴露方法。然后追问“哪种代理性能更高”其实高版本JKD动态代理在经过优化后性能已经接近CGLIB但CGLIB在创建代理时开销较大。更高级的面试问题还包括“事务管理失效的场景有哪些”无论你多熟练都可能漏掉“方法内部调用this.xxx()导致代理失效因为这是绕过代理直接调用目标方法”。如果你能顺带说出“解决方案是注入自身代理或使用AopContext.currentProxy()”再补一句“Transactional默认只回滚RuntimeException检查异常不会回滚”这个环节基本稳了。Spring还有一大主题是“循环依赖”。很多面试者知道“三级缓存”但说不清为什么需要三级而不是两级。第一级缓存存成品Bean第二级存早期暴露的Bean尚未填充属性第三级存ObjectFactory用于产生代理对象。核心逻辑是当A依赖于B、B依赖于A时先让A暴露一个早期引用放入三级缓存B创建时可以直接引用这个早期A从而打破死锁。但如果不需要代理为什么还要第三级因为Spring希望“提前暴露的是最终代理对象”而代理对象只有在实例化后才知道是否需要创建通过切面判断。如果没有三级缓存只靠二级缓存那么单例模式下循环依赖虽然可以解决但AOP代理的时机就会错乱可能导致B拿到的是未代理的A。这么一解释你就回答了“为什么要三级缓存”的真正原因——不是为了解决循环依赖而是为了在解决循环依赖的同时还保持AOP代理的正确性。这句话记下来面试中直接降维打击。SpringBoot呢核心不是“自动配置”这个结果而是EnableAutoConfiguration、ConditionalOnMissingBean、spring.factories或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports这套“条件装配机制”。如果你能展开说“SpringBoot为什么能基于pom依赖就能装配WebMVC因为AutoConfiguration类被加载后会根据当前classpath是否包含DispatcherServlet和Servlet容器来决定是否创建相关Bean”那你就不只是一个“会用SpringBoot的人”。另外Spring中的设计模式也是爱考的高频点BeanFactory是工厂模式AOP代理是代理模式事件监听是观察者模式JdbcTemplate是模板方法模式Spring的Resource是策略模式。不要背“一种模式对应一个类”而是回答“这种模式在Spring中解决了什么问题”。把这个清单变成你的“肌肉记忆”以上知识你不是看了就等于会了。你必须用“自问自答”的方式做输出训练拿到任何一道题先自己说上三分钟然后回放看哪里卡壳。集合的底层数据结构、JVM的内存分区与GC流程、Spring的Bean生命周期与循环依赖这三条主线相互独立又能交叉联动。比如“HashMap在多线程下丢失数据和JVM重排序有什么关系”或者“Spring的默认单例Bean在Spring容器里就是依赖JVM堆上的对象存储那ThreadLocal里的Spring事务信息呢”这些问题可以逼着自己把知识网织起来。面试不是考试背诵而是“实战模拟”。只要你多问自己几次“为什么这样设计”“如果不这样设计会怎样”再常见的八股也能变成你独到的见解。这份清单或许不能保证你拿到Offer但一定能让你在回答时“眼里有光”而不是“嘴里有词”。最后留一句扎心的总结面试官真正在听的不是你对某个知识点的“陈述”而是你在被连续追问“为什么”之后是否还能保持思路清晰。所以请把这份清单当成你的“教练”而不是“小抄”。每天抽出40分钟一个子话题一个子话题地“讲给自己听”。一个月后当你再听到“Java面试复习清单”这几个字你会笑出来因为那些知识已经不在清单里而在你的血液中。这份清单最后的目标是让你忘掉清单。
返回列表