Skip to main content
Version: Next

Java 后端面试高频问题分类

面试题按知识域分为七大类。准备时不要逐题死背,按「分类 → 答题框架 → 场景落地」组织:每一题都延伸到自己项目里的真实实践,答题才有说服力。

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 代理等延伸考点。 :::

面试前自检清单​

  • HashMap / 线程池 / volatile 能白板画出流程
  • Bean 生命周期 + 事务失效 5 个场景能举例
  • B+ 树 / MVCC / 索引失效场景能结合 SQL 讲
  • 缓存三兄弟(穿透 / 击穿 / 雪崩)+ 一致性方案能对比
  • 登录全链路能从前端表单讲到 JWT 签发与拦截
  • 「访问次数统计」能讲清明细表 + 联合索引 + 汇总表三层演进
  • 高并发接口能按「定位 → 缓存 → 限流 → 异步 → 扩容 → 降级」分层展开