ARTICLE DETAIL

资讯详情

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

备战Java面试,我整理了一份高频考点清单

备战Java面试,我整理了一份高频考点清单 笔试前一晚我盯着屏幕上密密麻麻的八股文突然意识到一个残酷的事实Java面试考的不是你会什么而是你能在三十秒内说出什么。那些在项目里写了三年的HashMap面试官问起底层扩容机制时我大脑依然一片空白。后来我花了整整两个月把市面上所有高频考点压缩成一张A4纸又经过三轮大厂面试验证才敢说真正摸清了Java面试的脉。今天这份清单不是给你背的是帮你建立「考点坐标系」的。基础语法背后的“淘汰逻辑”Java面试从不会直接问你“int和Integer有什么区别”而是藏在自动装箱的坑里等你跳。一道经典题目Integer a 127, b 127; a b?你背过答案说true但面试官立刻追问“那换成128呢”——这就是考缓存区间。真正拉开差距的是你对-128到127这个数字为什么存在的理解它不是为了省内存而是为了JVM启动时预先加载高频对象减少GC压力。如果你能答出“超出缓存区间会new新对象”你已经赢了一半。再看String、StringBuilder、StringBuffer三兄弟。别掉进线程安全与效率的二选一陷阱里面试官真正想听的是字符串常量池的“驻留机制”。你写String s new String(a)时创建了几个对象答案是1个或2个——取决于常量池是否已有“a”。这种题没有技巧但你可以用“引用计数器”思路来拆解先看堆再看常量池。异常处理也别只背try-catch-finally。一段包含return的代码finally里修改返回值到底生效吗答案是不生效因为finally的修改发生在引用拷贝上。但如果你能补充一句“在finally里做资源清理时如果清理本身抛出异常会覆盖原始异常”面试官眼睛会亮。集合框架的“灵魂三问”到了集合这个板块高频考点不是API用法而是“为什么这么设计”。比如HashMap必问三点底层结构、扩容机制、死循环问题。你至少要能画出“数组链表红黑树”的演化过程并说出TREEIFY_THRESHOLD 8的依据——泊松分布下链表长度达到8的概率极低所以这个数字是数学推演不是拍脑袋。扩容时loadFactor 0.75同样有讲究太大导致冲突高太小浪费内存0.75是空间和时间的平衡点。Java 8以后的HashMap在扩容时为什么不再死循环了因为头插法换成了尾插法同时引入了loHead和hiHead两个链表来拆分红黑树。但面试官会继续追问“那并发下还有问题吗”——当然有数据丢失和size不准确依然存在所以正确答案是“HashMap并发不安全要用ConcurrentHashMap”。聊ConcurrentHashMap记住“锁粒度”这三个字就是你的得分点。JDK 7用分段锁JDK 8抛弃分段锁改用synchronized CAS锁住桶首节点。你要能随口说出size()方法在并发下怎么统计先无锁累加两次如果两次结果一致就返回不一致再给所有桶加锁。另外ConcurrentHashMap的扩容是“多线程协助”的每个线程负责一个区间迁移。并发变成“送分题”的秘密并发是Java面试的分水岭。十个考生里八个能背出synchronized和ReentrantLock的区别但只有两个能说清“锁升级”的过程无锁→偏向锁→轻量级锁→重量级锁。这个升级过程背后是Mark Word的位变化面试官若追问“偏向锁撤销的性能损耗”你就回答“竞争激烈时不如直接上重量级锁因为撤销一次偏向锁要STWStop The World”。volatile考点集中在“可见性”和“禁止指令重排”。别只说“线程安全”要说出主存与工作内存的交互模型。更进阶的答法是结合DCL双重检查锁的单例模式为什么要用volatile修饰instance因为new一个对象有三步——分配内存、初始化、赋值重排序后可能让另一个线程拿到半初始化的对象。这道题几乎每次面试必出务必背到条件反射。ThreadLocal也是高频雷区。你优雅地说“每个线程有自己的副本”面试官反手就会问内存泄漏。关键就在ThreadLocalMap的Entry继承了WeakReference但value是强引用如果ThreadLocal对象被回收value永远没法被触达。所以正确答案是“用完必须remove()”要是能顺带说一句“ThreadLocal在Web框架中常用于链路追踪但要注意线程池复用导致脏数据”那就是加分项。AQS是并发工具的底层基石。面试官问ReentrantLock你答到AbstractQueuedSynchronizer的state状态和CLH队列就是高分。state用volatile修饰加锁用CAS改state抢不到就加入等待队列前驱节点释放锁后通过LockSupport.unpark唤醒后继节点。记住这个流程CountDownLatch、Semaphore的答案都可以顺藤摸瓜。JVM调优的“硬核表演”JVM考点太广但面试官最爱挑“内存区域”和“垃圾回收”下手。内存区域别背“堆、栈、方法区”要画图——线程共享的是堆和方法区线程私有的是虚拟机栈、本地方法栈、程序计数器。为什么要分开因为垃圾收集主要发生在堆而栈的生命周期与线程绑定不需要回收。方法区在JDK 8之后改成“元空间”用本地内存替代永久代本质是避免OOM上限。垃圾回收算法更要答出“代际”思维。年轻代用复制算法因为存活率低老年代用标记-清理或标记-整理因为对象大且存活率高。高频追问“什么时候对象进入老年代”——年龄达到15默认、大对象直接进入、动态年龄判定。别漏掉“内存分配担保”机制当Survivor区放不下时会提前转移到老年代。GC日志看不懂面试官让你看一段日志问“这是什么垃圾收集器”你只需要抓住关键词ParNew是年轻代并行收集器CMS是老年代并发收集器两者配套被称为“ParNew CMS”组合。CMS的痛点在于“浮动垃圾”和“空间碎片”这也催生了G1的Region分区设计——G1的-XX:MaxGCPauseMillis参数可以控制停顿时间这是CMS做不到的。调优实战题也躲不开“线上CPU飙到100%怎么排查”标准流程是top找进程号→top -Hp找线程号→jstack转成十六进制→在栈里找业务线程卡死的位置。如果还带了“频繁Full GC”则要jmap -dump导出堆快照用MAT查看大对象。这一整套链路就是面试官心中的“有实战经验”。Spring与Spring Boot的“考点地图”Spring家族是Java面试的必坑之地。第一个坑IoC和AOP别只背定义要能答出“Bean的生命周期”实例化→属性填充→Aware接口→BeanPostProcessor前置→初始化方法→后置→使用→销毁。如果你能顺带说出“Spring在哪个阶段对Bean做AOP代理”一定是BeanPostProcessor的后置阶段面试官直接给你加分。AOP高频追问“JDK动态代理和CGLIB有什么区别”JDK代理要求目标类实现接口底层用Proxy生成新类CGLIB通过继承生成子类所以无法代理final类。Spring Boot 2.x默认使用CGLIB因为效率更高且不需要接口。再追问“Spring AOP的链路是怎样的”答“切面和方法调用会被包裹进一个调用链类似责任链模式”。Spring Boot的自动配置是兵家必争之地。核心是EnableAutoConfigurationspring.factories里的AutoConfiguration.imports文件。要说出“条件注解”的作用ConditionalOnClass、ConditionalOnMissingBean。这样你就能解释为什么引入spring-boot-starter-web后DispatcherServlet就自动注册了——因为WebMvcAutoConfiguration满足条件后执行。Spring事务失效的场景是面试官的快乐源泉。列举方法自调用同名类内部不走代理、try-catch吞掉异常但不回滚、private方法无法被切入、propagation设置不当。特别是“自调用”这道题很多老手都会踩坑你必须答出“通过AopContext.currentProxy()或注入自身来解决”。MySQL索引与SQL优化是“必考大题”数据库在Java面试中占30%权重索引是核心中的核心。B树索引要背出三层结构页、叶子节点、双向链表。为什么用B树而不是B树或红黑树因为B树叶子节点存数据且形成链表范围查询只需要顺序遍历非叶子节点只存索引一个页能存更多键值树更矮。磁盘IO次数和树高直接相关InnoDB默认高度2-3层能支撑千万级数据。最左前缀法则必考。你对面试官说“联合索引(a,b,c)的生效条件是查询条件从a开始且不能跳过中间列”这只是及格。高分答法是能用上索引的三种情况“等值查询、范围查询的左边部分、覆盖索引”。再进阶一步你要会用EXPLAIN看key_len字段判断联合索引命中了哪些列——这直接证明你有实战调优能力。深分页优化是初级面试官最爱设的坑。比如LIMIT 100000, 10为什么会慢因为要扫描十万行然后丢弃。解决方案有三种延迟关联先通过覆盖索引定位主键再回表查完整行、书签记录记住上一页最后一条的id、子查询优化。更亮眼的答法是“如果业务上只允许用有限页那就限制翻页深度否则用游标或快照。”死锁排查也是高频大题。两个事务分别持有S锁和X锁然后互相等待对方的资源。考点是“查看当前事务的隔离级别”和“定位死锁日志”——SHOW ENGINE INNODB STATUS中能看到LATEST DETECTED DEADLOCK里面记录了两个事务的SQL语句。解决方案是按固定顺序加锁或者用SELECT ... FOR UPDATE时设低隔离级别。Redis与分布式系统的“大厂敲门砖”Redis几乎成了Java进阶的必备技能。缓存穿透、击穿、雪崩这三兄弟必须门儿清。穿透指查询不存在的数据解决方案是布隆过滤器或缓存空值击穿指热点key过期瞬间被高并发打爆解决方案是互斥锁或逻辑过期雪崩指大量key同时过期或Redis宕机解决方案是过期时间加随机值、集群部署、多级缓存。Redis为什么单线程还快别扯“IO多路复用”就结束要讲清epoll模型。Redis的读事件和写事件都注册在epoll上内核通知某个socket可读时事件处理器从链表取出事件并回调对应函数。而“单线程”指的是命令执行是单线程网络IO模块在6.0之前也是单线程这避免了线程切换和锁竞争。分布式锁是Redis在大厂面试的常客。用SETNX加锁用Lua脚本保证原子性释放——这已经是标准答案。但面试官会立刻进阶“如果Redis在加锁后宕机了怎么办”答给锁设过期时间但问题又来了——“业务执行超过锁过期时间怎么办”正确思路是看门狗机制Redisson的watch dog自动续期或者在业务结束时检查时间差是否接近过期。消息队列的考点越来越偏“为什么”。比如Kafka为什么吞吐量高你要答出“顺序写磁盘页缓存零拷贝sendfile”。而“如何保证消息不丢失”要从三个端来说生产者用ack机制消费者手动提交offsetBroker用副本机制。更棘手的是“幂等性”题——答“消费者用唯一ID去重或者用数据库唯一索引”。给冲刺者的最后一句整理这份清单的过程比背答案更有价值。你发现没有所有高频考点其实都指向同一个底层能力把“怎么做”翻译成“为什么这么做”。面试官不是想看你背诵的流畅度而是想观察你遇到陌生问题时能否顺着原理推演出合理结论。备战Java面试最忌讳的是把面试当作期末考试而忽略了它本质是一场关于“解决问题思维”的对话。下次打开八股文文档别从第一个字开始背。先尝试画一张“HashMap底层结构图”再闭眼模拟一次“从输入URL到返回响应”的完整链路最后拿笔写一段“如何设计一个秒杀系统”。当你亲手推导出这些考点背后的逻辑链条你会发现那些恐怖的面试题不过是你在真实代码里早已养成的直觉而已。真正的考场从来不在会议室里而在你每一次写代码时的思考中。
返回列表