2026年9月 Java 面试题整理:200道 Java 高频面试题复习清单
2026年9月 Java 面试题整理:200道 Java 高频面试题复习清单
这份清单整理了 200道Java面试题,覆盖Java基础、集合、并发、JVM、Spring、MySQL、Redis、消息队列、分布式、系统设计和算法,适合面试前查漏补缺。同时纳入项目深挖、持久层、网络与Linux、工程化、安全测试、全栈协作和Java AI应用。
自测时,试着回答三个问题:结论是什么?为什么?能举个例子吗? 把每题标成“能讲清楚 / 讲不完整 / 还不会”,优先复习后两类。
题目选自我们维护的免费「面试题」。本篇按18个知识领域精选,包含基础与进阶题,不按面试频次排名。
复习目录
- 自我介绍与项目深挖:第1—8题。
- Java 基础与现代 Java:第9—25题。
- 集合框架与源码:第26—36题。
- 并发编程与 JMM:第37—52题。
- JVM、GC 与性能诊断:第53—65题。
- Spring、Spring Boot 与安全:第66—84题。
- 持久层、MyBatis 与 JPA:第85—92题。
- MySQL、SQL 与数据建模:第93—110题。
- Redis 与缓存工程:第111—123题。
- Kafka、RocketMQ 与 RabbitMQ:第124—135题。
- 微服务与分布式系统:第136—149题。
- 网络、操作系统与 Linux:第150—159题。
- 系统设计与业务场景:第160—169题。
- 工程化、云原生与可观测性:第170—177题。
- 测试、质量与应用安全:第178—183题。
- 数据结构、算法与手写代码:第184—192题。
- 前端基础与全栈协作:第193—196题。
- Java AI 应用与 Spring AI:第197—200题。
自我介绍与项目深挖
-
请用 3 分钟完成一段面向 Java 开发岗位的自我介绍。
-
挑一个最能代表你的项目,说明它解决了什么业务问题。
-
画出项目的整体架构,并说明一次请求经过了哪些组件。
-
你在项目中具体负责什么?如何区分个人贡献和团队成果?
-
项目里最难的技术问题是什么?你是如何拆解和解决的?
-
项目中遇到过什么线上故障?你如何止损、定位、修复和复盘?
-
你做过哪项性能优化?优化前后的数据分别是多少?
-
项目如何保证接口幂等?幂等键、状态机和唯一约束如何配合?
Java 基础与现代 Java
-
JDK、JRE 和 JVM 分别是什么?它们之间是什么关系?
-
重载和重写有什么区别?编译期和运行期分别如何选择方法?
-
接口和抽象类有什么区别?你会如何做工程选型?
-
==、equals 和 hashCode 之间是什么关系?
-
为什么 String 被设计为不可变对象?
-
String、StringBuilder 和 StringBuffer 如何选择?
-
int 和 Integer 有什么区别?自动装箱、拆箱和缓存有哪些陷阱?
-
Java 异常体系如何划分?Checked Exception 和 RuntimeException 如何选?
-
try-with-resources 是如何保证资源关闭的?异常压制是什么?
-
泛型解决了什么问题?什么是类型擦除?
-
Lambda、Stream 和 Optional 分别适合解决什么问题?
-
Java 参数传递到底是值传递还是引用传递?
-
Stream 的惰性求值、短路操作和并行流有哪些注意事项?
-
Record 适合表达什么数据?它与普通不可变类有什么不同?
-
从 Java 8 迁移到 Java 17/21/25,需要检查哪些兼容性和依赖风险?
-
简单工厂、工厂方法和抽象工厂有什么区别?如何避免过度设计?
-
策略、工厂和责任链模式如何组合处理可扩展业务规则?
集合框架与源码
-
Java 集合框架的主要接口和实现类有哪些?
-
ArrayList 和 LinkedList 的数据结构、复杂度和真实使用差异是什么?
-
HashMap 的底层结构、put 流程和 get 流程是什么?
-
为什么 HashMap 的容量通常是 2 的幂,默认负载因子是 0.75?
-
HashMap 在什么条件下树化和退化?为什么使用红黑树?
-
HashSet 如何保证元素不重复?它与 HashMap 是什么关系?
-
Iterator 的 fail-fast 是什么?它能否作为并发安全保证?
-
ConcurrentHashMap 在不同 JDK 版本中如何保证并发安全?
-
CopyOnWriteArrayList 的原理、成本和适用场景是什么?
-
TreeMap 和 LinkedHashMap 各自如何维护顺序?
-
如何安全地在遍历集合时删除元素?
并发编程与 JMM
-
Java 线程有哪些状态?状态之间如何转换?
-
sleep、wait、join、park 有什么区别?
-
Java 内存模型解决了什么问题?
-
原子性、可见性和有序性分别是什么?
-
volatile 能保证什么,不能保证什么?
-
happens-before 规则有哪些?如何用它证明代码正确?
-
synchronized 如何实现?锁升级与优化经历了什么变化?
-
synchronized 和 ReentrantLock 如何选择?
-
CAS 的原理是什么?ABA、忙等和高竞争问题如何处理?
-
ThreadLocal 的实现原理是什么?为什么可能产生内存泄漏?
-
Java 线程池的核心参数、执行流程和拒绝策略是什么?
-
如何根据 CPU 密集、IO 密集和下游容量设置线程池?
-
AQS 的状态、同步队列和 Condition 队列如何协作?
-
如何优雅停止线程和线程池?interrupt 的正确语义是什么?
-
如何构造、检测和排查 Java 死锁?
-
虚拟线程与平台线程的调度模型有什么不同?
JVM、GC 与性能诊断
-
JVM 运行时数据区域如何划分?哪些区域是线程私有的?
-
Java 对象的创建过程是什么?对象一定分配在堆上吗?
-
如何判断对象是否可回收?GC Roots 包括哪些对象?
-
强、软、弱、虚引用有什么区别?
-
标记清除、复制、标记整理和分代收集分别解决什么问题?
-
常见垃圾收集器有哪些?G1 的核心设计是什么?
-
Minor GC、Major GC 和 Full GC 分别意味着什么?
-
类加载过程有哪些阶段?加载、链接和初始化分别做什么?
-
双亲委派模型解决了什么问题?哪些场景会打破它?
-
常见 OOM 类型有哪些?每一种该如何收集证据?
-
ZGC、Shenandoah 与 G1 的目标和适用场景有什么差异?
-
线上 CPU 飙高时,如何把系统线程定位到 Java 方法?
-
如何分析内存持续增长、内存泄漏和频繁 Full GC?
Spring、Spring Boot 与安全
-
什么是 IoC 和依赖注入?它们解决了什么问题?
-
Spring Bean 的生命周期有哪些关键阶段和扩展点?
-
Bean 的作用域有哪些?单例 Bean 一定线程安全吗?
-
Spring 如何解决常见的单例循环依赖?哪些情况无法解决?
-
为什么循环依赖实现中会出现三级缓存?它和 AOP 有什么关系?
-
什么是 AOP?Spring AOP 的代理对象如何创建?
-
JDK 动态代理和 CGLIB 代理如何选择?
-
Spring 事务是如何通过代理生效的?
-
事务传播行为和隔离级别分别解决什么问题?
-
@Transactional 常见失效场景有哪些?
-
Spring MVC 一次请求的完整处理流程是什么?
-
过滤器、拦截器、ControllerAdvice 和 AOP 如何选择?
-
Spring Boot 自动配置的核心原理是什么?
-
Starter、AutoConfiguration 和条件注解如何协作?
-
Spring Boot 应用从 main 方法到 Web 服务就绪经历了什么?
-
配置文件、环境变量、命令行参数和配置中心的优先级如何管理?
-
Spring Security 的过滤器链和 SecurityContext 如何工作?
-
如何为 Spring Boot 服务实现优雅启动、优雅停机和流量摘除?
-
Spring、Spring Boot 与 Spring Cloud 的职责边界和协作关系是什么?
持久层、MyBatis 与 JPA
-
JDBC 执行一条查询经历了哪些步骤?
-
数据库连接池解决了什么问题?核心参数如何设置?
-
MyBatis 的 SqlSession、Executor、StatementHandler 分别负责什么?
-
MyBatis 中 #{} 和 ${} 有什么区别?为什么后者可能导致 SQL 注入?
-
MyBatis 的一级缓存和二级缓存如何工作?为什么二级缓存使用较少?
-
MyBatis 动态 SQL 的常用能力和维护风险是什么?
-
什么是 N+1 查询?如何通过日志、抓包或指标发现它?
-
连接池耗尽时如何判断是慢 SQL、长事务、泄漏还是下游故障?
MySQL、SQL 与数据建模
-
InnoDB 为什么是 MySQL 的默认存储引擎?它的核心能力是什么?
-
一条 SQL 从客户端到返回结果经历了哪些阶段?
-
为什么 InnoDB 使用 B+ 树作为主要索引结构?
-
聚簇索引和二级索引有什么区别?什么是回表?
-
联合索引的最左前缀原则是什么?哪些条件会中断匹配?
-
覆盖索引和索引下推分别减少了什么成本?
-
什么情况下 MySQL 可能不使用你创建的索引?
-
如何读懂 EXPLAIN 中的访问类型、key、rows、filtered 和 Extra?
-
ACID 分别是什么?InnoDB 如何实现事务?
-
脏读、不可重复读和幻读分别是什么?
-
MySQL 的隔离级别有哪些?InnoDB 的默认行为有什么特点?
-
MVCC 的 Read View、隐藏列和 undo log 如何协作?
-
redo log、undo log 和 binlog 分别解决什么问题?
-
MySQL 中有哪些行锁和间隙锁?它们何时出现?
-
如何分析并处理 MySQL 死锁?为什么简单重试还不够?
-
如何系统地优化一条慢 SQL,而不是直接加索引?
-
如何解决深分页?游标分页有哪些限制?
-
分库分表的拆分键如何选择?跨库查询、分页和唯一键如何处理?
Redis 与缓存工程
-
Redis 常用数据类型、底层编码和典型场景有哪些?
-
Redis 为什么快?事件循环、内存访问和数据结构分别贡献了什么?
-
如何使用 Redis 实现缓存、排行榜、计数器和限流?
-
缓存穿透、缓存击穿和缓存雪崩有什么区别?
-
缓存与数据库如何保持一致?为什么不存在通用的完美方案?
-
Redis 的过期删除策略和内存淘汰策略有哪些?
-
RDB 和 AOF 的流程、持久性和恢复速度如何权衡?
-
Redis 主从复制的全量同步和增量同步如何工作?
-
Sentinel 解决了什么问题?故障转移期间会发生什么?
-
Redis Cluster 如何使用 16384 个槽分片?MOVED 和 ASK 有什么区别?
-
使用 SET NX PX 实现分布式锁需要满足哪些条件?
-
什么是 Big Key?如何发现、删除和预防?
-
什么是 Hot Key?如何识别并分散访问压力?
Kafka、RocketMQ 与 RabbitMQ
-
消息队列解决了哪些耦合、削峰和异步问题?它带来了哪些复杂度?
-
如何保证消息不丢失?生产者、Broker 和消费者分别做什么?
-
消息为什么会重复?消费者如何实现幂等?
-
如何保证消息有序?全局顺序和分区顺序有什么代价?
-
消息积压时如何止损、扩容、回放和保护下游?
-
Kafka 的 Topic、Partition、Replica 和 Consumer Group 是什么?
-
RocketMQ、Kafka 和 RabbitMQ 的定位与典型选型依据是什么?
-
死信、重试和延迟消息应如何设计,避免无限循环?
-
Kafka Producer 的 acks、重试和幂等生产者如何配合?
-
Kafka Consumer 的位点提交时机如何影响重复和丢失?
-
RabbitMQ 的 Exchange、Queue、Binding 和路由键如何协作?
-
如何设计 Outbox/CDC 模式,保证数据库事务和消息发布一致?
微服务与分布式系统
-
单体、模块化单体和微服务分别适合什么阶段?
-
如何划分微服务边界?按表拆服务为什么通常是坏主意?
-
服务注册与发现的工作流程是什么?客户端发现和服务端发现有何差异?
-
API 网关承担哪些职责?哪些业务逻辑不应该放在网关?
-
什么是超时、重试、熔断、降级、隔离和限流?它们如何组合?
-
重试为什么可能放大故障?如何使用退避、抖动和重试预算?
-
CAP 和 BASE 分别表达什么?常见误解有哪些?
-
强一致、顺序一致、因果一致和最终一致有什么区别?
-
分布式事务有哪些实现思路?2PC、TCC、Saga 和消息最终一致如何选?
-
分布式锁有哪些实现方式?Redis、ZooKeeper 和数据库方案如何取舍?
-
全局唯一 ID 有哪些生成方案?时钟回拨和趋势递增如何处理?
-
如何保证跨服务调用的幂等和去重?
-
Nacos 的服务发现、健康检查和配置推送分别如何工作?
-
Elasticsearch 的倒排索引、mapping、分词器和 doc values 分别解决什么问题?
网络、操作系统与 Linux
-
从输入 URL 到页面展示,DNS、TCP、TLS、HTTP 和浏览器分别做了什么?
-
TCP 和 UDP 的语义、开销和适用场景有什么区别?
-
TCP 三次握手为什么不能简化为两次?
-
TCP 四次挥手和 TIME_WAIT 分别解决什么问题?
-
TCP 如何通过序号、确认、重传和滑动窗口保证可靠传输?
-
HTTP/1.1、HTTP/2 和 HTTP/3 的核心差异是什么?
-
HTTPS 握手如何完成身份认证、密钥协商和加密通信?
-
Cookie、Session、Token 和 JWT 有什么区别?
-
进程和线程的地址空间、调度和通信方式有什么差异?
-
Linux 上如何查看进程、端口、CPU、内存、磁盘和网络状态?
系统设计与业务场景
-
面对系统设计题,你会按什么顺序澄清需求、估算容量并展开方案?
-
如何设计一个短链接系统?
-
如何设计一个秒杀系统,避免超卖并保护数据库?
-
如何设计一个实时排行榜?
-
如何设计大文件分片上传、断点续传和秒传?
-
如何设计订单创建、支付和超时关闭流程?
-
如何设计一个可靠的接口幂等组件?
-
如何设计库存预占、扣减、释放和对账流程?
-
如何设计多租户 SaaS 的租户、权限和数据隔离?
-
给定日活、峰值 QPS 和数据保留周期,如何完成容量与成本估算?
工程化、云原生与可观测性
-
Maven 的生命周期、依赖范围和依赖冲突如何处理?
-
Docker 镜像与容器是什么关系?容器与虚拟机有什么区别?
-
Kubernetes 中 Pod、Deployment、Service 和 Ingress 分别负责什么?
-
启动、存活和就绪探针有什么区别?错误配置会造成什么故障?
-
什么是 CI/CD?一次可靠发布流水线应包含哪些检查和证据?
-
日志、指标和链路追踪分别回答什么问题?
-
如何实现蓝绿发布、金丝雀发布和功能开关?
-
如何设计结构化日志、Trace ID 和敏感字段脱敏?
测试、质量与应用安全
-
单元测试、集成测试、契约测试和端到端测试分别验证什么?
-
SQL 注入、XSS、CSRF、SSRF 分别如何产生和防护?
-
密码应如何存储?为什么不能使用可逆加密或普通哈希?
-
认证和授权有什么区别?RBAC、ABAC 和数据权限如何组合?
-
文件上传接口需要检查哪些扩展名、内容、路径、权限和病毒风险?
-
JWT 常见的签名、过期、撤销、重放和密钥轮换问题是什么?
数据结构、算法与手写代码
-
如何分析时间复杂度和空间复杂度?均摊复杂度是什么?
-
手写二分查找,并正确处理左右边界和重复元素。
-
手写链表反转,并比较迭代与递归实现。
-
如何判断链表是否有环,并找到环的入口?
-
如何找出数组中和为目标值的两个数或三个数?
-
二叉树的前序、中序、后序和层序遍历如何实现?
-
如何实现 LRU 缓存,保证 get 和 put 都是 O(1)?
-
BFS 和 DFS 如何选择?如何避免图遍历中的重复访问?
-
动态规划题如何定义状态、转移、初始化和遍历顺序?
前端基础与全栈协作
-
前后端分离项目如何设计统一请求、错误码、登录态和权限?
-
CORS 为什么由浏览器执行?预检请求和凭证模式如何处理?
-
文件上传、下载、SSE 和 WebSocket 的前后端接口应如何设计?
-
如何用 OpenAPI 管理接口契约、代码生成、兼容性检查和版本演进?
Java AI 应用与 Spring AI
-
RAG 的数据加载、切分、向量化、检索和生成流程是什么?
-
Prompt、结构化输出和 Tool Calling 分别适合解决什么问题?
-
Spring AI 的 ChatClient、Model API、Advisor 和 VectorStore 各自负责什么?
-
如何处理模型幻觉、提示注入和不可信检索内容?
讲不清楚的题,对照免费「面试题」。
浙公网安备 33010602011771号