Java后端面试7天速成:从HashMap到Spring的系统复习指南

📅 2026/7/1 5:56:14
Java后端面试7天速成:从HashMap到Spring的系统复习指南
在实际 Java 后端开发面试中面试官考察的从来不是孤立的八股文背诵而是候选人能否将零散的知识点串联成线并应用到真实的项目场景中。一个典型的面试流程往往从基础数据结构如 HashMap切入考察你对语言特性的理解接着深入到 JVM 内存模型和垃圾回收看你是否具备性能调优的底层意识然后通过并发编程问题检验你对多线程安全与协作的掌握最后结合 MySQL、Redis、Spring 等主流技术栈评估你的项目设计、问题排查和系统架构能力。这个过程环环相扣任何一个环节的薄弱都可能影响最终评价。本文旨在为准备 Java 后端开发面试的工程师提供一个系统性的复习框架。我们将围绕“每天 2 小时7 天搞定”的节奏将核心考点拆解为可执行的学习计划。重点不在于罗列所有面试题而在于构建知识体系理解每个考点背后的“为什么”并掌握从理论到实践、从现象到排查的完整链路。无论是应届生查漏补缺还是资深工程师梳理知识脉络都能从中找到清晰的复习路径。1. 第一天深入 HashMap 与集合框架集合框架是 Java 基础中的基石而 HashMap 因其高频使用和精妙设计成为面试的必考题。理解 HashMap不能停留在“数组链表/红黑树”的表面必须深入到哈希冲突解决、扩容机制、线程安全等细节。1.1 HashMap 的核心工作原理与源码关键点HashMap 的核心是一个NodeK,V[] table数组。当调用put(key, value)时会通过(n - 1) hash计算 key 的哈希值在数组中的索引位置。这里的hash并非key.hashCode()的原始值而是经过了(h key.hashCode()) ^ (h 16)的高位扰动目的是让哈希值的高位也参与运算减少哈希冲突。当发生哈希冲突即计算出的索引位置已存在元素时JDK 1.8 采用了“链表-红黑树”转换机制。在同一个索引位置桶上元素首先以链表形式存储。当链表长度超过阈值默认为 8且当前数组长度大于等于 64 时链表会转换为红黑树以将查询时间复杂度从 O(n) 降至 O(log n)。反之当树节点数小于等于 6 时红黑树会退化为链表。扩容是另一个核心机制。HashMap 有一个负载因子loadFactor默认 0.75和容量capacity。当元素数量超过capacity * loadFactor时会触发扩容resize将数组容量扩大为原来的 2 倍并对所有元素重新进行哈希计算和位置分配。这是一个耗时的操作。// 一个展示 HashMap put 流程关键步骤的简化示例非完整源码 public V put(K key, V value) { // 计算哈希值 int hash hash(key); // 计算数组索引 int i indexFor(hash, table.length); // 遍历链表或树查找 key 是否已存在 for (NodeK,V e table[i]; e ! null; e e.next) { if (e.hash hash ((k e.key) key || (key ! null key.equals(k)))) { V oldValue e.value; e.value value; // 覆盖旧值 return oldValue; } } // 添加新节点 addEntry(hash, key, value, i); return null; }面试高频追问点为什么链表转红黑树的阈值是 8基于泊松分布统计哈希冲突达到 8 的概率极低。为小概率事件准备红黑树这种复杂结构是一种空间换时间的权衡。扩容时为什么是 2 的幂次这样设计使得(n - 1) hash等价于hash % n但位运算的效率远高于取模运算。HashMap 是否线程安全不安全。多线程并发 put 可能导致数据覆盖、链表成环JDK 1.7 及之前等问题。线程安全场景应使用ConcurrentHashMap。1.2 ConcurrentHashMap 的线程安全实现演进ConcurrentHashMap是应对 HashMap 线程不安全问题的解决方案。其实现经历了显著演进JDK 1.7采用分段锁Segment机制。整个 Map 由多个 Segment 组成每个 Segment 继承自ReentrantLock。put 操作只锁住对应的 Segment不同 Segment 的操作可以并发进行提高了并发度。JDK 1.8 及以后摒弃了分段锁采用Node synchronized CAS的实现。锁的粒度更细只锁住链表或红黑树的头节点桶。大量使用compareAndSwapCAS无锁算法进行状态修改如sizeCtl的控制进一步提升了并发性能。1.3 ArrayList vs LinkedList vs Vector 的应用场景与坑ArrayList基于动态数组。支持快速随机访问get(int index)是 O(1)但在列表中间插入或删除元素需要移动后续所有元素O(n)。初始化时指定预估容量可以避免多次扩容带来的性能损耗。LinkedList基于双向链表。在头部或尾部插入、删除元素很快O(1)但随机访问需要遍历O(n)。ListIterator可以在迭代时高效地进行插入删除。Vector历史遗留的线程安全列表所有方法都用synchronized修饰性能较差。已被Collections.synchronizedList(new ArrayList())或CopyOnWriteArrayList取代。常见坑遍历时删除使用for循环或foreach遍历ArrayList并直接调用remove()会抛出ConcurrentModificationException。正确做法是使用Iterator.remove()。// 错误示例 for (String item : list) { if (someCondition) { list.remove(item); // 可能抛出 ConcurrentModificationException } } // 正确示例 IteratorString iterator list.iterator(); while (iterator.hasNext()) { String item iterator.next(); if (someCondition) { iterator.remove(); // 安全删除 } }未指定初始容量对于已知大小的ArrayList不指定初始容量会导致多次扩容和数组拷贝影响性能。误用 LinkedList 做随机访问频繁调用list.get(i)在 LinkedList 上是 O(n) 操作性能极差。2. 第二天JVM 内存模型、垃圾回收与性能调优JVM 是 Java 程序运行的基石。理解其内存模型和垃圾回收机制是诊断内存溢出、性能瓶颈等问题并进行有效调优的前提。2.1 JVM 运行时数据区详解JVM 运行时数据区主要分为线程共享和线程私有两部分。线程共享区堆Heap存放对象实例和数组。是垃圾回收的主要区域。进一步分为新生代Young Generation和老年代Old Generation。新生代又分为 Eden 区和两个 Survivor 区S0, S1。方法区Method Area存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在 HotSpot 虚拟机中也被称为“永久代”PermGenJDK 8 前或“元空间”MetaspaceJDK 8 及以后。线程私有区程序计数器PC Register当前线程所执行的字节码的行号指示器。Java 虚拟机栈Java Virtual Machine Stacks每个方法执行时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表存放了编译期可知的基本数据类型、对象引用reference和 returnAddress 类型。本地方法栈Native Method Stack为 Native 方法服务。关键点我们常说的“栈内存”通常指 Java 虚拟机栈存放局部变量和引用。“堆内存”存放对象本身。String s new String(abc”)引用s在栈上字符串对象abc在堆上。2.2 垃圾回收算法与 HotSpot 实现垃圾回收GC主要针对堆内存。核心算法包括标记-清除Mark-Sweep标记所有存活对象然后清除未标记对象。会产生内存碎片。复制Copying将内存分为两块每次只使用一块。GC 时将存活对象复制到另一块然后清空当前块。效率高无碎片但浪费一半空间。常用于新生代Eden 到 Survivor Survivor 之间的复制。标记-整理Mark-Compact标记存活对象后将所有存活对象向一端移动然后清理边界外的内存。常用于老年代。HotSpot JVM 的垃圾收集器是这些算法的具体实现Serial / Serial Old单线程收集器简单高效适用于客户端应用或小内存场景。ParNewSerial 的多线程并行版本用于新生代。Parallel Scavenge / Parallel Old吞吐量优先的并行收集器目标是达到可控制的吞吐量运行用户代码时间 / (运行用户代码时间 GC 时间)。CMSConcurrent Mark Sweep以获取最短回收停顿时间为目标的并发收集器。过程复杂已逐步被淘汰。G1Garbage-First面向服务端应用的收集器。将堆划分为多个大小相等的 Region可预测停顿时间同时兼顾吞吐量和低延迟。是 JDK 9 以后的默认收集器。ZGC / Shenandoah新一代低延迟收集器停顿时间可达亚毫秒级适用于超大堆内存。2.3 内存问题诊断与 JVM 参数调优实战常见内存问题OutOfMemoryError: Java heap space堆内存不足。可能原因内存泄漏、堆大小设置过小、数据量激增。OutOfMemoryError: Metaspace或PermGen space元空间/永久代不足。可能原因动态生成大量类如 CGLib、反射加载过多类。StackOverflowError栈深度溢出。通常由无限递归或过深的方法调用引起。诊断工具与命令jps查看 Java 进程 ID。jstat查看 JVM 统计信息如 GC 情况。jstat -gc pid 1000 10每 1 秒打印一次 GC 信息共 10 次。jmap生成堆转储快照heapdump。jmap -dump:formatb,fileheap.hprof pid。jstack打印线程堆栈信息用于分析死锁、高 CPU 等问题。jstack pid thread_dump.txt。可视化工具JConsole, VisualVM, Eclipse MAT分析 heapdump。关键 JVM 参数示例# 设置堆初始大小和最大大小 -Xms4g -Xmx4g # 设置新生代大小 -Xmn2g # 设置元空间大小 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize256m # 指定使用 G1 收集器 -XX:UseG1GC # 打印 GC 详细信息 -XX:PrintGCDetails -XX:PrintGCDateStamps -Xloggc:/path/to/gc.log # 发生 OOM 时自动生成堆转储 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/path/to/dump.hprof调优思路监控先行使用jstat、GC 日志等监控 GC 频率、停顿时间、各区域内存变化。定位问题通过堆转储和 MAT 分析内存中哪些对象占用了大量空间是否存在无法回收的引用内存泄漏。调整参数根据应用特点如响应优先或吞吐优先和监控结果调整堆大小、新生代/老年代比例、选择或调整垃圾收集器参数。代码优化避免创建大对象、及时关闭资源如 IO 流、数据库连接、谨慎使用静态集合等。3. 第三天Java 并发编程核心与 JUC 工具包并发编程是后端开发的核心难点也是面试区分度最高的领域之一。不仅要理解概念更要能解决实际的线程安全问题。3.1 线程状态、创建方式与核心机制Java 线程有 6 种状态NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。 创建线程有三种基本方式继承Thread类、实现Runnable接口、实现Callable接口可获取返回值并结合FutureTask或线程池使用。核心机制synchronizedJava 关键字提供内置锁监视器锁。可以修饰方法或代码块保证同一时刻只有一个线程能执行该段代码。涉及锁升级过程无锁 - 偏向锁 - 轻量级锁 - 重量级锁。volatile保证变量的可见性和禁止指令重排序但不保证原子性。常用于状态标志位。wait() / notify() / notifyAll()Object类的方法用于线程间协作。必须在synchronized块内调用。3.2 JUCjava.util.concurrent核心组件解析JUC 包提供了高性能、线程安全的并发编程工具。ReentrantLock可重入的互斥锁比synchronized更灵活支持公平锁、非公平锁可中断、可超时。CountDownLatch倒计时器。一个或多个线程等待其他线程完成操作。初始化时设定计数countDown()减一await()等待计数为零。CyclicBarrier循环栅栏。让一组线程到达一个屏障时被阻塞直到最后一个线程到达屏障所有线程才继续执行。可重复使用。Semaphore信号量。控制同时访问特定资源的线程数量。ThreadPoolExecutor线程池核心类。必须掌握其 7 大核心参数corePoolSize核心线程数。maximumPoolSize最大线程数。keepAliveTime非核心线程空闲存活时间。unit时间单位。workQueue工作队列如ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue。threadFactory线程工厂。handler拒绝策略AbortPolicy,CallerRunsPolicy,DiscardPolicy,DiscardOldestPolicy。ConcurrentHashMap如前所述线程安全的 HashMap。CopyOnWriteArrayList写时复制的线程安全列表适合读多写少的场景。3.3 原子类、CAS 与 AQS 原理浅析原子类AtomicInteger,AtomicReference等基于 CAS 操作提供原子性的更新无需加锁性能高。CASCompare-And-Swap一种无锁的乐观并发控制。包含三个操作数内存位置V、预期原值A和新值B。当且仅当 V 的值等于 A 时才将 V 的值更新为 B否则什么都不做。存在“ABA”问题可通过AtomicStampedReference解决。AQSAbstractQueuedSynchronizerJUC 中锁和同步器的框架。内部维护一个 FIFO 队列和一个状态变量state。ReentrantLock,CountDownLatch,Semaphore等都是基于 AQS 实现的。理解 AQS 有助于深入理解 JUC 组件的工作原理。并发编程常见坑与最佳实践锁粒度不当锁住整个方法或大对象导致并发度低。应尽量缩小同步代码块范围。死锁两个或以上线程互相等待对方释放锁。避免方法按固定顺序获取锁、使用带超时的锁tryLock。线程池参数配置不当核心线程数、队列大小设置不合理导致任务堆积或大量线程创建。需要根据任务类型CPU 密集型、IO 密集型和系统资源进行调优。ThreadLocal内存泄漏ThreadLocal变量使用后必须调用remove()清理尤其是在线程池环境中线程会被复用。volatile误用误以为volatile能保证复合操作如i的原子性。4. 第四天MySQL 核心原理、索引与事务隔离MySQL 是后端存储的核心其索引和事务机制是面试的重中之重。4.1 InnoDB 存储引擎与 B 树索引InnoDB 是 MySQL 默认的存储引擎支持事务、行级锁和外键。数据存储表数据本身是按照主键顺序组织的聚簇索引的叶子节点。因此根据主键查询非常高效。B 树索引InnoDB 使用 B 树作为索引数据结构。与 B 树相比B 树的所有数据都存储在叶子节点且叶子节点间有指针连接非常适合范围查询和全表扫描。聚簇索引叶子节点存储整行数据。一张表只有一个聚簇索引通常是主键。非聚簇索引二级索引叶子节点存储的是主键值。通过二级索引查询时需要先查到主键再回表到聚簇索引中查找完整数据回表查询。4.2 索引优化与 SQL 性能分析索引失效的常见场景对索引列进行函数操作、计算或类型转换。WHERE YEAR(create_time) 2024。使用!或操作符。使用OR连接多个条件且并非所有列都有索引。模糊查询以通配符开头。LIKE ‘%abc’。复合索引未遵循最左前缀原则。SQL 性能分析工具EXPLAIN分析 SQL 执行计划的关键命令。重点关注以下字段type访问类型从好到坏systemconsteq_refrefrangeindexALL。key实际使用的索引。rows预估需要扫描的行数。Extra额外信息如Using index覆盖索引、Using filesort需要额外排序、Using temporary使用临时表。EXPLAIN SELECT * FROM user WHERE name 张三 AND age 20;4.3 事务与隔离级别详解事务具有 ACID 特性原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability。 MySQL 提供了四种隔离级别用于平衡并发性能和数据一致性读未提交Read Uncommitted可能读到其他事务未提交的数据脏读。读已提交Read Committed只能读到其他事务已提交的数据。解决脏读但存在不可重复读问题同一事务内两次读取同一数据结果不一致。可重复读Repeatable ReadMySQL 默认级别。保证同一事务内多次读取同一数据的结果一致。解决脏读和不可重复读但存在幻读问题同一事务内两次查询第二次查询看到了第一次查询未看到的新行。InnoDB 通过 MVCC多版本并发控制和间隙锁Gap Lock在一定程度上解决了幻读。串行化Serializable最高隔离级别所有事务串行执行。解决所有并发问题但性能最差。MVCC多版本并发控制InnoDB 实现高并发事务的核心机制。通过在每行记录后保存两个隐藏列创建版本号和删除版本号并结合 Undo Log使得读操作快照读不需要加锁写操作通过比较版本号来保证一致性。锁机制行锁锁住某一行。InnoDB 支持。间隙锁Gap Lock锁住一个索引区间防止其他事务在这个区间内插入新行解决幻读。临键锁Next-Key Lock行锁 间隙锁的组合。5. 第五天Redis 核心数据类型、持久化与高可用Redis 作为高性能的内存数据存储常用于缓存、会话存储、排行榜等场景。5.1 五种核心数据类型与使用场景String最简单的键值对。可用于缓存、计数器INCR、分布式锁SETNX。Hash键值对集合。适合存储对象如用户信息。HSET user:1 name “张三” age 30。List双向链表。可用于消息队列LPUSH/BRPOP、最新列表LTRIM。Set无序、不重复的集合。可用于共同关注、抽奖SRANDMEMBER。Sorted Set (ZSet)有序集合每个元素关联一个分数score。可用于排行榜、延迟队列。5.2 持久化机制RDB 与 AOFRDBRedis Database在指定时间间隔内生成数据集的时间点快照。优点文件紧凑恢复速度快适合备份。缺点可能丢失最后一次快照后的数据fork子进程进行持久化时如果数据量大会阻塞主线程。AOFAppend Only File记录服务器接收到的每一个写命令并在服务器启动时重放这些命令来重建数据集。优点数据丢失风险低可读性强。缺点文件通常比 RDB 大恢复速度慢。混合持久化Redis 4.0结合两者优点。AOF 文件重写时会将当前数据以 RDB 格式写入 AOF 文件头部后续命令继续以 AOF 格式追加。重启时先加载 RDB 内容再重放 AOF 命令。配置示例# 开启 RDB900秒内至少1个key变化则保存 save 900 1 # 开启 AOF appendonly yes # AOF 持久化策略每秒同步一次 appendfsync everysec5.3 高可用架构主从复制、哨兵与集群主从复制Replication一个主节点Master负责写多个从节点Slave负责读和备份。数据从主节点异步复制到从节点。解决了数据备份和读扩展问题但主节点故障需要手动切换。哨兵Sentinel在主从复制基础上引入哨兵进程来监控主从节点的健康状态。当主节点故障时哨兵能自动将一个从节点升级为主节点并让其他从节点指向新的主节点实现自动故障转移。集群ClusterRedis 3.0 引入的分布式方案。数据分片存储在多个节点上16384 个槽每个节点负责一部分槽。支持主从复制和故障转移。客户端直接连接集群由集群负责将请求路由到正确的节点。缓存常见问题缓存穿透查询一个不存在的数据请求直达数据库。解决方案布隆过滤器Bloom Filter拦截、缓存空值设置较短过期时间。缓存击穿某个热点 key 过期瞬间大量请求同时击穿到数据库。解决方案设置热点 key 永不过期、使用互斥锁如 Redis 的SETNX只让一个线程去重建缓存。缓存雪崩大量 key 在同一时间过期导致所有请求都打到数据库。解决方案给 key 的过期时间加上随机值、使用集群分散风险、设置二级缓存。6. 第六天Spring 框架核心IoC、AOP 与事务管理Spring 框架的核心是 IoC控制反转和 AOP面向切面编程它们构成了 Spring 生态的基石。6.1 IoC 容器与 Bean 的生命周期IoC 的核心思想是将对象的创建、依赖注入和生命周期管理交给容器ApplicationContext来完成而不是由程序员手动new。Bean 的作用域singleton默认单例、prototype每次请求创建新实例、request、session、global-sessionWeb 应用。Bean 的生命周期实例化Instantiation属性赋值Populate properties调用Aware接口方法如BeanNameAware,BeanFactoryAwareBeanPostProcessor.postProcessBeforeInitialization初始化Initialization调用InitializingBean.afterPropertiesSet或init-methodBeanPostProcessor.postProcessAfterInitializationBean 就绪可使用容器关闭时调用DisposableBean.destroy或destroy-method依赖注入方式构造器注入推荐、Setter 注入、字段注入Autowired。Spring 4.3 后如果类只有一个构造器Autowired可以省略。6.2 AOP 原理与常见应用AOP 将横切关注点如日志、事务、安全从业务逻辑中分离出来提高代码的模块化。核心概念切面Aspect横切关注点的模块化即一个类包含通知和切点。连接点Join Point程序执行过程中可以插入切面的点如方法调用、异常抛出。通知Advice切面在特定连接点执行的动作。类型Before,After,AfterReturning,AfterThrowing,Around。切点Pointcut匹配连接点的表达式定义通知在何处执行。引入Introduction为类添加新的方法或属性。织入Weaving将切面应用到目标对象创建代理对象的过程。Spring AOP 使用运行时织入基于动态代理。实现方式JDK 动态代理基于接口。目标类必须实现至少一个接口。CGLIB 动态代理基于继承。可以代理没有接口的类。通过生成目标类的子类来创建代理。Aspect Component public class LoggingAspect { // 定义切点匹配 service 包下所有类的所有方法 Pointcut(execution(* com.example.service.*.*(..))) public void serviceLayer() {} // 前置通知 Before(serviceLayer()) public void logBefore(JoinPoint joinPoint) { System.out.println(即将执行方法: joinPoint.getSignature().getName()); } // 环绕通知 Around(serviceLayer()) public Object logExecutionTime(ProceedingJoinPoint pjp) throws Throwable { long start System.currentTimeMillis(); Object result pjp.proceed(); long elapsedTime System.currentTimeMillis() - start; System.out.println(pjp.getSignature() 执行耗时: elapsedTime ms); return result; } }6.3 Spring 事务管理机制Spring 通过声明式事务管理极大地简化了事务操作。核心接口PlatformTransactionManager。传播行为Propagation定义事务方法在调用其他事务方法时事务如何传播。常用REQUIRED默认如果当前存在事务则加入该事务否则创建一个新事务。REQUIRES_NEW总是新建一个事务如果当前存在事务则将其挂起。NESTED如果当前存在事务则在嵌套事务内执行否则行为同REQUIRED。SUPPORTS如果当前存在事务则加入否则以非事务方式运行。隔离级别Isolation与数据库隔离级别对应如READ_COMMITTED,REPEATABLE_READ。声明式事务使用Transactional注解。可以标注在类或方法上。注意Transactional默认只对RuntimeException及其子类回滚对Exception不回滚。可通过rollbackFor属性指定。常见坑事务失效方法非public。自调用同一个类中一个非事务方法调用另一个Transactional方法。因为代理机制自调用不会经过代理类。异常被catch后未抛出。数据库引擎不支持事务如 MyISAM。大事务问题一个事务中包含过多的业务逻辑和数据库操作导致锁持有时间过长影响并发性能。应将事务粒度尽量缩小。7. 第七天项目场景设计与系统设计思维面试最后阶段常会考察项目经验和系统设计能力。这需要你将前六天的知识点融会贯通并展现解决问题的思路。7.1 如何描述你的项目描述项目时采用STAR 法则Situation, Task, Action, ResultSituation项目背景、规模、你在团队中的角色。Task你负责的具体任务和目标。Action你采取了哪些行动使用了哪些技术遇到了什么困难如何解决的。这是重点要结合具体技术点如用了 Redis 缓存解决热点数据查询慢用了线程池优化批量处理。Result取得了什么成果性能提升百分比、稳定性提高、用户体验改善等。技术细节准备对你简历上写的每一个技术点都要能深入一层。例如写了“使用 Redis 缓存”就要能说出用了哪种数据结构、如何保证缓存一致性、如何处理缓存穿透/击穿/雪崩。7.2 典型场景设计题思路设计一个短链接系统功能长链接转短链接短链接跳转。核心哈希算法如 MurmurHash、自增 IDBase62 编码、键值存储Redis 做缓存MySQL 持久化、跳转301/302 重定向。难点哈希冲突解决、高并发发号、跳转性能。设计一个分布式 ID 生成器要求全局唯一、趋势递增、高可用。方案UUID无序、数据库自增性能瓶颈、Redis 自增、雪花算法Snowflake推荐、Leaf美团开源。雪花算法64位 1位符号位 41位时间戳 10位机器ID 12位序列号。如何保证缓存与数据库的双写一致性先更新数据库再删除缓存Cache-Aside主流方案。存在极短时间的不一致删除缓存失败时需重试。先删除缓存再更新数据库不一致窗口期可能更长。设置缓存过期时间最终一致性保障。串行化将更新操作放入队列顺序执行保证强一致但牺牲性能。如何设计一个秒杀系统核心思路分层过滤、削峰填谷。前端静态化页面、按钮防重复点击、验证码。网关/负载均衡限流、恶意请求拦截。服务层无状态化、业务逻辑前置如库存校验提前到 Redis Lua 脚本中、异步化下单成功后异步扣减库存、生成订单。数据层Redis 预扣库存、MQ 削峰、数据库最终一致性。7.3 面试准备清单与心态调整技术复习清单[ ] 基础HashMap、ConcurrentHashMap、ArrayList/LinkedList 区别、synchronized/volatile。[ ] JVM内存区域、垃圾回收器、GC 日志分析、OOM 排查。[ ] 并发线程状态、线程池参数、锁、JUC 常用工具。[ ] MySQL索引原理B树、SQL 优化EXPLAIN、事务隔离级别、锁。[ ] Redis数据类型、持久化、集群、缓存问题解决方案。[ ] SpringIoC/AOP 原理、Bean 生命周期、事务传播行为。[ ] 项目能清晰描述 1-2 个核心项目并深入技术细节。[ ] 场景准备几个经典系统设计题的思路。面试心态把面试看作一次技术交流而不是考试。遇到不会的问题可以坦诚说明但可以尝试给出自己的分析思路展现解决问题的能力。多问“为什么”理解技术背后的设计哲学比死记硬背答案更有价值。复习的最后一天不再追求覆盖所有细节而是将知识串联起来形成自己的知识图谱。针对自己的薄弱环节进行针对性强化并模拟面试场景进行自问自答。记住面试官更看重的是你思考问题的方式和将技术应用于实际场景的能力。