前几天有位读者私信我,说自己在牛客上刷了半个月的面经,知识点也背了不少,可一到现场面试,面试官问一句“你们项目里的缓存穿透是怎么解决的”,脑子就一片空白,只能零散蹦出几个术语,最后草草收场。
这种“背了但用不上”的困境,在 Java 面试里太常见了。根本原因不是你不努力,而是复习的时候没有把“八股文”和“项目场景”串成一条线。
这篇文章就来帮你解决这个问题。我用一套系统化的思路,把 Java 面试里最高频的核心考点整理成一张知识地图,再把“八股文怎么答”和“项目场景题怎么讲”结合起来。无论你是准备秋招的应届生,还是想跳槽的初中级工程师,只要能认真跟着过一遍,再用文末的一周冲刺计划逼自己一把,就完全有机会在短时间内把面试核心点吃透。
文章涉及的知识点会比较多,建议先收藏,再按章节逐块消化。为了不让篇幅失控,每个大点我只讲最核心的答题思路和高频变体,更细的内容可以顺着文中给出的方向继续深挖。
1. 先搞明白:Java 面试到底在考什么
在开始列知识点之前,我们先把“面试官视角”搞清楚。很多准备面试的同学容易陷入一个误区:以为面试就是考记忆,背得越多越好。
实际上,面试官的问题通常分为三类。
1.1 基础理论题(八股文)
这类题用来快速检验你的“地基”是否扎实。比如 JVM 内存模型、HashMap 底层原理、synchronized 和 ReentrantLock 的区别等。它们的特点是:答案相对固定,有标准解,适合在短时间内大量刷题来覆盖。
1.2 场景设计题(项目题)
这类题没有唯一答案,面试官会抛出一个业务场景,比如“你的系统收到大量订单时怎么保证不超卖”“你们的支付回调接口怎么保证幂等”,然后观察你如何分析问题、如何选型、如何落地。
这类题是区分“背答案”和“真会做”的关键,也是很多准备不充分的候选人最容易翻车的环节。
1.3 开放式深挖题
面试官会基于你说的某一个技术点不断向下追问,直到你答不上来为止。比如你刚说“我们用了 Redis 缓存”,他马上会追问“缓存和数据库的一致性怎么解决”“如果 Redis 挂了怎么办”“缓存雪崩你怎么预防”。这种追问的目的,是检验你对知识理解的深度和边界。
所以,真正高效的面试准备,不是背 100 个问题的字面答案,而是围绕核心知识脉络,把“是什么、为什么、怎么做、有什么坑”全部串起来。接下来,我们就按照这个逻辑,从最核心的 Java 基础开始。
2. Java 基础核心考点:别让送分题变送命题
Java 基础是面试的第一关,也是很多“看似简单实则容易翻车”的地方。下面几个考点几乎每次面试都会被问到,需要重点掌握。
2.1 面向对象:三大特性的底层理解
面试官通常不会直接问“什么是封装/继承/多态”,而是会换角度问:
- “多态的实现原理是什么?”
- “重载(Overload)和重写(Override)有什么区别?”
- “Java 为什么不支持多继承?”
答题时,光背概念不够,要能上代码说明。比如多态:
public class Animal { public void speak() { System.out.println("Animal speaks"); } } public class Dog extends Animal { @Override public void speak() { System.out.println("Dog barks"); } } // 使用多态 Animal a = new Dog(); a.speak(); // 输出:Dog barks这段代码展示的就是运行时多态,它依赖继承、方法重写和父类引用指向子类对象三个条件。底层原理是 JVM 在运行时通过方法表来确定实际调用哪个方法,这个过程称为动态绑定。
2.2 String 相关:不可变性、StringBuilder、字符串常量池
String 是高频考点,常见的问法有:
- “String 为什么设计成不可变的?”
- “String、StringBuilder、StringBuffer 的区别?”
- “new String("abc") 创建了几个对象?”
考察核心是理解 JVM 中的字符串常量池。简单来说,直接使用字符串字面量"abc"时,会先去常量池查找是否存在相同内容,存在则复用;使用new String("abc")时,则会在堆中额外创建一个新对象。
String s1 = "abc"; // 常量池 String s2 = "abc"; // 复用常量池中的对象 String s3 = new String("abc"); // 堆中新建对象 System.out.println(s1 == s2); // true System.out.println(s1 == s3); // false System.out.println(s1.equals(s3));// true这段代码经常出现在笔试题里。回答时可以先说结论,再画一个简易内存示意,最后补充 equals 比较的是值,== 比较的是引用。
2.3 集合框架:HashMap 是绝对重点
如果只能选一个 Java 集合考点押题,那一定是 HashMap。它的高频问题包括:
- HashMap 底层数据结构是什么?
- put 方法的执行流程是什么?
- 为什么 HashMap 线程不安全?
- 1.7 和 1.8 有什么区别?
一个完整的 HashMap put 流程可以概括为:
- 计算 key 的 hash 值;
- 定位数组下标;
- 该位置为空,直接放入;
- 不为空,检查 key 是否相同,相同则覆盖;
- 不同则判断是链表还是红黑树;
- 链表则尾插遍历,长度超过阈值(8)且数组长度达到 64 时转红黑树;
- 元素个数超过阈值则扩容。
这里有一个很隐蔽的坑:很多人只记得“链表长度超过 8 转红黑树”,却忽略了前提是数组长度必须达到 64。如果数组长度没到 64,就算链表再长也只会扩容。
2.4 异常体系:Error 和 Exception 的区别
异常相关的考点虽然分值不大,但几乎必问。需要分清:
- Error:程序无法恢复的严重错误,如 OutOfMemoryError、StackOverflowError。
- Exception:程序可以处理的异常,分为受检异常(如 IOException)和运行时异常(如 NullPointerException)。
回答时可以补充“try-catch-finally 中 finally 什么时候不执行”:比如System.exit()或者 JVM 崩溃时,finally 中的代码可能不执行。
2.5 面试官追问常用套路
以上基础考点,面试官很少只满足于你背出概念。他往往会在你回答完后追加一两个“为什么”,所以建议把相关的原理自己动手查一遍,比如:
- 为什么 HashMap 的扩容负载因子是 0.75?
- String 的 hashCode 为什么用 31?
- Arrays.asList 返回的 List 为什么不能增删?
这类“为什么”的问题,才是让你和普通候选人拉开差距的关键。
3. JVM 核心考点:内存、垃圾回收与线上排查
JVM 是 Java 面试中的硬骨头,也是区分中高级工程师的核心模块。一般来说,基础岗会问内存划分和垃圾回收算法,中高级岗还会追问排查方法和调优思路。
3.1 JVM 内存区域:先画图,再讲解
面试时可以回答运行时数据区分为五块:
- 程序计数器:当前线程执行字节码的行号指示器,线程私有。
- Java 虚拟机栈:存放栈帧,每个方法调用对应一个栈帧,线程私有。
- 本地方法栈:为 native 方法服务。
- Java 堆:存放对象实例,是垃圾回收的主要区域,所有线程共享。
- 方法区:存储类信息、常量、静态变量等。在 1.8 之后,方法区被实现为元空间,使用本地内存。
建议用“线程私有不私有”为主线分两组记忆:程序计数器、虚拟机栈、本地方法栈是私有的;堆和方法区是共享的。
3.2 垃圾回收:可达性分析、GC Roots、回收算法
核心考点包括:
- 如何判断对象已死?引用计数法和可达性分析的区别。
- 哪些对象可以作为 GC Roots?
- Minor GC 和 Full GC 的区别。
- 常见垃圾回收器的适用场景。
这里最容易忽略的是 GC Roots 的具体内容。可以概括为:
- 虚拟机栈中引用的对象;
- 方法区中静态属性引用的对象;
- 方法区中常量引用的对象;
- 本地方法栈中 JNI 引用的对象。
回答时可侧重说明“可达性分析是从一组根对象向下搜索,不可达即视为可回收”,同时提醒“不可达不等于立即回收,还要经过 finalize 机制等可选步骤”。
3.3 OOM 异常:从报错到排查
最近很多同学在群里问“Java: OutOfMemoryError: insufficient memory”这类报错,这里顺便梳理一下。
OOM 常见的几种类型:
| 异常信息 | 可能原因 | 排查方向 |
|---|---|---|
| Java heap space | 堆内存不足,对象过多 | dump 堆文件,分析大对象 |
| Metaspace | 元空间不够,类加载过多 | 查看类加载器是否泄漏 |
| StackOverflowError | 栈深度超限,常见于递归 | 检查递归条件和调用链 |
| Direct buffer memory | 堆外内存不足 | 检查 NIO 缓冲区使用 |
排查时建议先用jmap -dump导出堆快照,再用 MAT 或者 VisualVM 分析大对象。实际项目中,很多 OOM 的根源是某个 List 把大量数据全量加载到内存里,优先排查这种“一次性加载过多”的代码路径。
3.4 类加载机制:双亲委派模型的优缺点
类加载相关的问题通常围绕双亲委派模型展开。回答要点是:
- 类加载器分层:启动类加载器、扩展类加载器、应用类加载器;
- 双亲委派:收到加载请求后,先让父加载器尝试加载;
- 好处:避免类被重复加载,保证核心类不能被篡改;
- 破坏场景:Tomcat 的 WebAppClassLoader 会先加载自己目录下的类,典型地打破了双亲委派。
4. 并发编程核心考点:从基础到面试加分项
并发编程既是面试重点,也是项目高频坑点。很多同学容易把 synchronized 和 volatile 的底层原理背混,这里我们把核心体系重新捋一遍。
4.1 synchronized:重量级锁到轻量级锁的演进
考察 synchronized 时,面试官更想听到的是“锁升级”的过程,而不仅仅是“它是一个同步关键字”。
可以这样组织答案:
- 无锁状态:对象没有竞争。
- 偏向锁:只有一个线程访问时,记录线程 ID,避免重复 CAS。
- 轻量级锁:出现竞争时,通过 CAS 尝试获取锁。
- 重量级锁:竞争加剧,线程被挂起,进入操作系统级同步。
同时需要说明 synchronized 是基于对象监视器 monitor 实现的,一个对象头里包含了 Mark Word,锁状态就记录在 Mark Word 中。如果能顺带画出对象头的简化结构,会是很不错的加分表现。
4.2 volatile:可见性与有序性,但不保证原子性
volatile 是高频易错点。核心记忆点:
- 保证可见性:写入后立即刷新到主存;
- 保证有序性:通过内存屏障禁止指令重排;
- 不保证原子性:i++ 这种复合操作依然线程不安全。
面试官经常追问“为什么 volatile 不保证原子性”。因为可见性只解决“读到的数据是最新的”,而 i++ 包含读-改-写三步,线程可能同时读到同一个值,最终导致计数丢失。
4.3 线程池:七大参数和执行流程
线程池在项目场景题中极其重要,几乎每个简历写了“高并发”的同学都会被追问。
先背熟七个参数:
- 核心线程数 corePoolSize;
- 最大线程数 maximumPoolSize;
- 空闲存活时间 keepAliveTime;
- 时间单位 unit;
- 阻塞队列 workQueue;
- 线程工厂 threadFactory;
- 拒绝策略 handler。
执行流程可以概括为:
- 当前线程数小于核心线程数,创建新线程执行任务;
- 超过核心线程数,任务进入阻塞队列;
- 队列满了,创建新线程直到最大线程数;
- 线程数达到最大且队列满了,触发拒绝策略。
四个拒绝策略分别是 AbortPolicy(抛异常)、CallerRunsPolicy(调用者线程执行)、DiscardPolicy(丢弃)、DiscardOldestPolicy(丢弃最老任务)。最常用的是 CallerRunsPolicy,因为它可以在某种程度上有节流作用。
4.4 CAS 和 AQS:并发底层的两个支柱
如果面试官问到“并发包底层原理”,CAS 和 AQS 是绕不开的。
CAS(Compare And Swap)是乐观锁的核心,底层通过 Unsafe 类提供原子操作。它的问题有三个:ABA 问题、循环开销大、只能保证单个变量的原子性。ABA 问题可以通过 AtomicStampedReference 加版本号解决。
AQS(AbstractQueuedSynchronizer)是 ReentrantLock、Semaphore、CountDownLatch 等并发工具的基础。核心思想是维护一个 state 和一个等待队列,通过模板方法模式让子类实现各自的同步语义。
5. Spring 与 Spring Boot:从 IoC 到自动配置
Spring 相关的问题是 Java 后端面试的绝对主力,占比很高。如果你简历上写了 Spring Boot 项目,这部分一定要重点准备。
5.1 IoC 和 AOP:不是背概念,而是讲应用
IoC(控制反转)的答题思路:传统开发中对象由自己 new,控制权在程序员手里;IoC 让 Spring 容器统一管理对象的创建和依赖注入,控制权反转到容器。
可以结合具体代码说明:
@Service public class OrderService { @Autowired private OrderMapper orderMapper; public Order getOrderById(Long id) { return orderMapper.selectById(id); } }这里 OrderService 不需要自己 new OrderMapper,而是由 Spring 容器注入,这就是依赖注入的体现。
AOP(面向切面编程)则要说清楚适用场景:日志记录、权限校验、事务管理、性能监控等。能说出“动态代理是 AOP 的底层实现,JDK 动态代理针对接口,CGLIB 针对类”这句话,就能过关。
5.2 Bean 的生命周期:面试官最爱的深挖题
Bean 的生命周期几乎必考,答题时按以下顺序:
- 实例化;
- 属性赋值(填充属性);
- Aware 接口回调(如 BeanNameAware、ApplicationContextAware);
- BeanPostProcessor 的 postProcessBeforeInitialization;
- @PostConstruct 初始化方法;
- InitializingBean 的 afterPropertiesSet;
- BeanPostProcessor 的 postProcessAfterInitialization;
- 使用;
- 销毁。
不必死记每个细节,但要说出“实例化、属性赋值、初始化、使用、销毁”这一主链路,并知道 BeanPostProcessor 在初始化前后各有一个扩展点。如果你的项目里有自定义扩展点,比如实现了某个接口做启动时的数据加载,一定要在这一题里主动带出来。
5.3 Spring Boot 自动配置原理
Spring Boot 的自动配置原理是高频考点。答题主线和关键词是:
- @EnableAutoConfiguration 是核心注解;
- 它通过 @Import 导入 AutoConfigurationImportSelector;
- 该选择器会读取 META-INF/spring.factories 或 AutoConfiguration.imports 文件;
- 再通过 @ConditionalOnClass、@ConditionalOnMissingBean 等条件注解判断是否生效。
跟这个问题配套的常问题目是:“Spring Boot 和 Spring 的区别是什么?”核心可以概括为:Spring Boot 基于 Spring,通过自动配置降低了配置成本,同时内置 Tomcat 等容器,让应用可以独立运行。
5.4 Spring 事务:失效场景是必考
事务相关题目里,最常翻车的是“Spring 事务在什么情况下会失效”。常见场景有:
- 方法被 private 修饰;
- 方法内部 this 调用,绕过代理;
- 异常被 try-catch 吞掉,事务感知不到异常;
- 抛出的是检查异常,且没有指定 rollbackFor;
- 数据库引擎不支持事务(比如 MyISAM)。
建议在回答时结合自己项目的实际案例,比如“我们为了避免事务失效,规定事务方法只能用 public,并且在入口方法上声明 rollbackFor = Exception.class”。
6. MySQL 与 Redis:项目场景题的两大支柱
做后端开发,数据库和缓存是项目里绕不开的两层。面试官问项目场景题时,八成都跟这两者相关。
6.1 MySQL 索引:最核心的高频题
索引相关的基础知识需要掌握:
- 索引的数据结构为什么是 B+ 树?与 B 树、红黑树相比有什么优势?
- 聚簇索引和非聚簇索引的区别是什么?
- 什么是回表查询?
- 最左前缀原则是什么?
回答时可以用“B+ 树非叶子节点只存索引,叶子节点存数据且通过链表连接”作为主线,说明为什么它适合范围查询。
然后结合 SQL 解释最左前缀原则:
-- 联合索引 (user_id, order_status, create_time) SELECT * FROM order_table WHERE order_status = 1 AND create_time > '2025-01-01';这条 SQL 无法利用索引,因为跳过了第一个字段 user_id。如果索引设计是项目中的亮点,可以顺势说明“我们建索引时,会优先考虑查询条件中频繁出现的等值字段,再考虑排序字段”。
6.2 MySQL 事务与隔离级别
ACID 四个特性要能用自己的话说一遍,并且分别说明底层机制:
- 原子性:通过 undo log 实现回滚;
- 一致性:应用层加数据库约束共同保证;
- 隔离性:通过锁和 MVCC 实现;
- 持久性:通过 redo log 崩溃恢复保证。
隔离级别从低到高:
- 读未提交;
- 读已提交;
- 可重复读(MySQL 默认);
- 串行化。
要能说出每个级别分别解决什么问题(脏读、不可重复读、幻读),以及 InnoDB 在可重复读级别下如何通过 MVCC 快照读和间隙锁来避免幻读。
6.3 缓存三大问题:穿透、击穿、雪崩
这是项目场景题中出现频率最高的组合拳。建议把每个问题的定义、原因、解决方案做成一张表:
| 问题 | 现象 | 核心解决方案 |
|---|---|---|
| 缓存穿透 | 查询了不存在的 key,每次落到数据库 | 参数校验、缓存空值、布隆过滤器 |
| 缓存击穿 | 某个热点 key 过期,瞬间大量请求落到 DB | 互斥锁重建缓存、逻辑过期 |
| 缓存雪崩 | 大量 key 同时过期,或 Redis 宕机 | 过期时间加随机值、集群高可用、多级缓存 |
回答时一定要结合业务。比如可以这么说:“我们项目里下单接口有一个热点商品维度,为了防止缓存击穿,我们并没有用分布式锁,而是采用了逻辑过期方案,因为互斥锁会阻塞读请求,逻辑过期可以做到立即返回旧值,再由后台线程重建缓存。”这种回答明显比背定义有感染力。
6.4 Redis 持久化和分布式锁
Redis 持久化机制的考点集中在 RDB 和 AOF 的区别:
- RDB:定期生成快照,文件小,恢复快,但可能丢失最后一次快照后的数据。
- AOF:记录写操作,数据更完整,但文件大,恢复慢。
- 混合持久化:结合两者优点,是 4.0 以后推荐的实践方式。
Redis 分布式锁也是一个热点,答题时可以围绕“用 SET NX EX 命令 + Lua 脚本释放锁”展开,同时说明需要给锁设置过期时间、需要唯一客户端标识、需要保证解锁操作的原子性。如果团队技术栈允许,还可以延伸提到 Redisson 的看门狗机制。
7. 项目场景题:怎么讲才能让面试官眼前一亮
前面铺垫了这么多基础考点,最终都要落到项目里。很多同学项目经历很丰富,但讲出来却很平淡,核心问题是“只讲了做了什么,没讲为什么这么做、遇到什么困难、如何排查”。
7.1 项目介绍的结构化表达:STAR 法则
推荐用 STAR 法则组织项目介绍:
- S(背景):项目是什么,为什么做;
- T(任务):你负责的模块目标是什么;
- A(行动):你采用了什么技术方案,踩了什么坑;
- R(结果):最终数据指标或效果怎么样。
以一个“订单系统改造”为例,可以这样说:
“我们的订单系统在高峰期会遇到库存超卖问题。我负责改造库存扣减模块,把原来的数据库行锁方案改成了 Redis 预扣减 + 异步消息最终一致性方案。通过 Lua 脚本保证扣减原子性,再定时同步回数据库。改造后,单机 TPS 从多少提升到多少,超卖记录从每月几次降为 0。”
这段话里每个信息点都能引出后续深挖:为什么用 Lua 脚本、异步消息失败了怎么办、数据库和 Redis 不一致怎么办。面试官追问时,你的基础知识点就派上用场了。
7.2 高频场景题的答题通用框架
如果面试官现场抛出一个你完全没遇到过的场景题,可以参考这个框架来拆解:
- 确认需求:明确系统的并发量、数据量、一致性要求;
- 拆分流程:把问题拆成数据写入、缓存更新、异常兜底几个环节;
- 选型对比:比较不同方案之间的取舍;
- 明确风险:说出这个方案可能存在的问题;
- 给出兜底:说明在极端情况下怎么办。
比如“如何设计一个秒杀系统”,不需要真的能在一分钟内给出完整架构,但你要能说出思路:前端限流、接口防重复提交、Redis 预扣库存、MQ 异步下单、数据库最终扣减、失败回滚和库存回补。
7.3 项目亮点整理清单
建议在面试前,把简历里的项目按以下维度重新整理一遍:
- 你负责的最复杂的一个功能是什么?
- 项目中最大的性能瓶颈是什么?
- 有没有发生过线上事故,如何排查的?
- 有没有优化过慢 SQL?优化前后效果如何?
- 你做了哪些防止超卖/防重/幂等的设计?
把这些问题想清楚,面试时就不怕“讲不出深度”了。
8. 一周冲刺计划:如何把知识点刷进脑子
很多同学收藏了无数面经,但到考前一周还是焦虑。这里分享一个可以落地的一周冲刺计划,适合已经有一定基础,需要系统回顾的人。
8.1 每日时间分配
| 天数 | 主攻模块 | 每日任务 |
|---|---|---|
| Day 1 | Java 基础 + 集合 | 重写 HashMap put 流程,默写 String 常量池图示,刷 3 道 LeetCode 热题 |
| Day 2 | JVM + 并发 | 画 JVM 内存分区图,手写线程池执行流程,梳理 synchronized 锁升级过程 |
| Day 3 | Spring + Spring Boot | 梳理 Bean 生命周期,理解自动配置原理,整理事务失效场景 |
| Day 4 | MySQL | 复习 B+ 树、索引优化、事务隔离级别,练习 3 条慢 SQL 优化 |
| Day 5 | Redis + 分布式 | 整理缓存穿透/击穿/雪崩,手写 Redis 分布式锁代码 |
| Day 6 | 项目复盘 | 用 STAR 法则整理 2 个项目,预设 20 个追问场景题 |
| Day 7 | 综合模考 | 找一套模拟题限时作答,错题整理,查漏补缺 |
8.2 复习工具推荐
- 用思维导图整理每个模块的知识树,每周过一遍主干;
- 把不会的题记在笔记软件里,按“问题-答案-追问”三栏整理;
- 睡前用 10 分钟默写一个流程,比如 Bean 生命周期、HashMap put 流程,比盲目刷资料记忆更牢。
8.3 避开两个常见误区
一是盲目追求题量,每天刷 200 道面经却不总结,结果面试时一变形就懵。二是只背不看项目,八股文背得滚瓜烂熟,项目一讲就空。建议把时间比例控制在基础知识点 40%、项目场景题 40%、刷题练习 20%,这样更接近面试的真实比例。
9. 高频问题避坑指南:这些细节别被扣分
以下这些细节属于“容易忽略、但一被问到就很容易卡壳”的地方,值得单独拿出来提个醒。
9.1 版本差异要说清楚
面试时提到 JDK 版本或框架版本时,不要说“我用的是新版本”,最好明确版本,并说明这个版本带来了什么变化。比如:
- JDK 8 和 JDK 17 的差异;
- Spring Boot 2.x 与 3.x 的区别;
- Lombok 与新版 JDK 的兼容性问题,比如“源发行版 17 需要目标发行版 17”的报错。
如果面试官问到这类版本问题,你能够从“我们项目实际遇到的坑”切入,会更容易获得认可。
9.2 报错信息也是一种面试题
高频报错包括:
OutOfMemoryError: Java heap space;StackOverflowError;ConcurrentModificationException;ClassNotFoundException和NoSuchMethodError;java.lang.IllegalStateException: You aren't using a compiler supported by lombok。
不要只背解决方案,要能根据异常堆栈判断出大致哪一层出了问题。比如ConcurrentModificationException,十有八九是遍历集合的同时做了增删操作,最稳妥的方案是把要删除的项先收集到新列表,最后统一 removeAll。
9.3 手撕代码题要保持好节奏
面试中手写代码的常见题目包括:快速排序、冒泡排序、单例模式、LRU 缓存、二分查找、字符串反转等。虽然难度不大,但要在白板/在线编辑器上写对,还是需要提前练几遍。
另外要有“先聊思路再写代码”的意识。可以先说“这个题我打算用双指针,从两端往中间走,时间复杂度是 O(n)”,再动手写,这样即使没完全写对,面试官也能看到你的思考过程。
10. 总结与最后的建议
到这里,整条 Java 面试知识主线已经梳理完了:从 Java 基础集合,到 JVM 和并发,再到 Spring 与数据库缓存,最后落到项目场景题和备考节奏上。这套知识体系不仅是为了应对“八股文”式提问,更是为了让你的项目描述有底层原理支撑。
对于准备秋招或者社招跳槽的同学,我的最终建议有三条:
第一,不要只收藏不消化。看完这篇文章,挑一个最薄弱的模块,花一天时间把它彻底弄懂。第二,项目里讲到的每一个技术点,都要能往下追问三层。第三,考前一周按冲刺计划执行,宁可少刷题,也要多复盘。
如果这篇文章对你有帮助,可以收藏备用,也欢迎把这套复习思路转发给正在备战 Java 面试的朋友。接下来,打开你的 IDE,先写一个最简单的单例模式,或者画一张 HashMap 的 put 流程图,你的面试复习,就从今天开始。