面试题按知识域分为七大类。准备时不要逐题死背,按「分类 → 答题框架 → 场景落地」组织:每一题都延伸到自己项目里的真实实践,答题才有说服力。
Java 基础
| 问题 | 答题要点 |
|---|
| HashMap 底层原理? | 数组 + 链表 + 红黑树(链表长度 ≥ 8 且数组 ≥ 64 时树化);默认容量 16、负载因子 0.75、2 的幂扩容;JDK 8 改为尾插法解决并发成环 |
== 与 equals 的区别? | == 比较基本类型值 / 引用地址;equals 默认同 ==,重写后比内容;重写 equals 必须重写 hashCode |
| String 为什么不可变? | final 类 + 私有 final 数组;线程安全、可缓存 hash、常量池复用;频繁拼接用 StringBuilder |
| 异常体系? | Throwable → Error / Exception;受检异常必须处理,非受检异常(RuntimeException)可不处理 |
| JDK 8 新特性? | Lambda、Stream、Optional、接口 default 方法、LocalDateTime |
Java 并发
| 问题 | 答题要点 |
|---|
| 线程池核心参数与执行流程? | 7 大参数:corePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory、rejectedExecutionHandler;流程:核心线程 → 队列 → 非核心线程 → 拒绝策略 |
volatile 的作用? | 保证可见性 + 禁止指令重排,不保证原子性;典型用途:状态标志位、DCL 单例 |
synchronized 和 ReentrantLock 区别? | synchronized 是 JVM 关键字(自动释放,锁升级:偏向 → 轻量 → 重量);ReentrantLock 是 API 层(可中断、超时、公平锁、多条件变量) |
| ThreadLocal 原理与内存泄漏? | 每个线程的 ThreadLocalMap 以弱引用 key 存储;线程池场景用完必须 remove(),否则 value 无法回收 |
| ConcurrentHashMap 怎么保证线程安全? | JDK 8:CAS + synchronized 锁单个桶头节点,并发度 = 桶数量 |
JVM
| 问题 | 答题要点 |
|---|
| JVM 内存区域? | 线程私有:程序计数器、虚拟机栈、本地方法栈;线程共享:堆、方法区(JDK 8 起由元空间实现) |
| 垃圾回收算法? | 标记-清除、标记-复制(新生代)、标记-整理(老年代);分代收集;CMS 已废弃 → G1(可预测停顿)→ ZGC(亚毫秒停顿) |
| 类加载过程与双亲委派? | 加载 → 验证 → 准备 → 解析 → 初始化;先委派父加载器,防止核心类被篡改;打破场景:SPI、Tomcat 隔离 |
| 线上 OOM / CPU 飙高怎么排查? | jmap -dump + MAT 分析、jstack 找死锁或高 CPU 线程、top -Hp、Arthas 一站式诊断 |
Spring / Spring Boot
| 问题 | 答题要点 |
|---|
| IOC 和 AOP? | IOC:对象创建与依赖关系交给容器,解耦;AOP:动态代理(JDK / CGLIB)实现日志、事务等横切关注点 |
| Bean 生命周期? | 实例化 → 属性填充 → Aware 回调 → BeanPostProcessor 前置 → 初始化(@PostConstruct)→ 后置 → 使用 → 销毁 |
| 循环依赖怎么解决? | 三级缓存(singletonObjects / earlySingletonObjects / singletonFactories);构造器循环依赖无法解决 |
| Spring Boot 自动装配原理? | @SpringBootApplication → @EnableAutoConfiguration → 加载 AutoConfiguration.imports(2.7+)→ 条件注解过滤 |
| 事务失效场景? | 方法非 public、自调用(this 调用绕过代理)、异常被 try-catch 吞掉、抛受检异常未配置 rollbackFor、多线程调用 |
| Spring MVC 请求流程? | DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → Service → JSON 序列化 |
MySQL
| 问题 | 答题要点 |
|---|
| 为什么用 B+ 树? | 矮胖(3 层可存千万数据)、叶子节点链表利于范围查询、非叶子节点只存索引使单页容纳更多键 |
| 聚簇索引与回表? | 主键索引叶子存整行,二级索引叶子存主键值;查二级索引未覆盖的列需回表;覆盖索引可避免回表 |
| 事务隔离级别与 MVCC? | 读未提交 → 脏读;读已提交 → 不可重复读;可重复读(默认);串行化。MVCC:undo log 版本链 + ReadView |
| 慢 SQL 怎么优化? | 慢查询日志定位 → EXPLAIN 看 type / key / rows → 加联合索引、覆盖索引、避免函数作用在索引列、深分页改游标 |
| 主从复制原理? | 主库写 binlog → 从库 IO 线程拉取写 relay log → SQL 线程重放;主从延迟应对:强制走主、并行复制 |
Redis
| 问题 | 答题要点 |
|---|
| 缓存穿透 / 击穿 / 雪崩? | 穿透:查不存在的数据 → 缓存空值 / 布隆过滤器;击穿:热 key 过期瞬间 → 互斥锁 / 逻辑过期;雪崩:大量 key 同时过期 → 过期时间加随机值 / 多级缓存 |
| 缓存与数据库一致性? | Cache Aside:读 → 缓存 → 未命中查库回填;写 → 先更库再删缓存;强一致用延迟双删 + 订阅 binlog(Canal) |
| 分布式锁怎么做? | SET key value NX EX + 唯一值(防误删)+ Lua 脚本(原子性);生产推荐 Redisson(看门狗自动续期) |
| RDB vs AOF? | RDB:定时快照,恢复快、可能丢分钟级数据;AOF:追加写命令、更安全、文件大;4.0+ 混合持久化 |
分布式与微服务
| 问题 | 答题要点 |
|---|
| CAP 与 BASE? | 网络分区时一致性与可用性二选一;BASE:基本可用 + 软状态 + 最终一致 |
| 分布式事务方案? | 2PC(强一致、同步阻塞)、TCC(业务侵入大)、本地消息表 / 事务消息(最终一致,最常用)、Seata AT |
| MQ 三大问题? | 消息丢失:生产确认 + 持久化 + 手动 ACK;重复消费:幂等(唯一键 / setnx);顺序:同一业务 key 路由同一队列 |
| 接口幂等怎么做? | 唯一索引、token 机制(先取 token 再提交校验)、分布式锁、状态机(乐观锁 version) |
| 限流的算法? | 计数器(窗口边界突刺)→ 滑动窗口 → 漏桶(恒定速率)→ 令牌桶(允许突发);单机 Guava,分布式 Redis + Lua |
:::note 备考建议
覆盖每张表后,重点打磨三道「串场题」:HashMap、线程池、事务失效场景——出现频率最高,且能自然引出并发模型、JUC、Spring 代理等延伸考点。
:::
面试前自检清单