Java 是后端岗面试里覆盖面最广的一门:同一场面试里,面试官会从集合问到并发,再从并发问到 JVM,最后落到 Spring 和 MyBatis 的原理。字节、腾讯、阿里、美团、京东、快手换了部门,开头的问题几乎没变,变的是追问到第几层。
这份合集从公开面经里把 Java 方向反复出现的八股题抽出来重新归类,一共 388 道题,分十二个主题:语言基础与集合、并发与锁、JVM 与垃圾回收、类加载与反射、Spring 全家桶和 MyBatis,最后是高频手撕题。MySQL 与 Redis 的内容请对照 MySQL 面试题合集 和 Redis 面试题合集,操作系统与网络基础有 操作系统面试题合集 和 计算机网络面试题合集,后端岗的完整高频清单可以看后端开发高频面试题榜单。
怎么用这份题单:
- 题目后面括号里是近期实际问过这道题的大厂,不代表完整名单,也不代表没标注的公司不问;没有括号的是同一知识点下面试官爱往深处追的延伸题
- Java 八股的追问是一条链:HashMap → ConcurrentHashMap → synchronized 与 CAS → 线程池 → JVM 内存与 GC。只背其中一个结论,面试官往下追一层就会卡住
- 集合、线程池、锁与 volatile、JVM 内存与垃圾回收、Spring 循环依赖与事务这五块是几乎所有 Java 岗的公共必考区,时间不够就先把它们吃透
主题导航:Java 基础与面向对象 · 集合框架 · 线程与线程池 · 锁、volatile、CAS 与 AQS · JVM 内存与对象 · 垃圾回收与调优排查 · 类加载、反射、代理与 IO · Spring IoC 与 Bean · Spring AOP、事务与 MVC · Spring Boot 与微服务 · MyBatis · 手撕题与场景编码
Java 基础与面向对象
- Java 基本类型有哪些?(美团 / 百度 / 华为)
- Java的基本数据类型各占多少字节(美团 / 快手 / 百度)
- Java基础:解释Java中基本类型和包装类的区别是什么?(美团 / 快手 / 携程)
- String、StringBuilder和StringBuffer三者的区别?(美团 / 百度 / 腾讯)
- String 的底层原理是什么?(美团 / 滴滴 / 京东)
- String可以继承吗?(华为 / 美团 / 百度)
- new String会创建几个对象?(百度 / 网易 / 美团)
- String 是 Java 的基本数据类型吗?(快手 / 华为 / 京东)
- String的常用方法有哪些?(百度 / 京东 / 美团)
- Java 中 equals 和 == 有什么区别?(美团 / 百度 / 字节跳动)
- hashcode和equals区别,只重写equals行不行(美团 / 快手 / 京东)
- Java 三大特性分别是什么?(美团 / 腾讯 / 字节跳动)
- 多态具体的实现?(腾讯 / 快手 / 字节跳动)
- 什么是多态?多态分哪几种?具体底层是怎么实现的?为什么可以实现?(快手 / 华为 / 字节)
- 运行时多态和编译时多态(百度 / 字节跳动 / 小米)
- Java 方法重载和重写有什么区别?(美团 / 百度 / 阿里)
- java中抽象类和接口的区别,实际应用中如何选择(腾讯 / 百度 / 美团)
- Java支持多继承吗?(美团 / 阿里 / 京东)
- final关键字有哪些作用?(美团 / 华为 / 网易)
- final修饰类、变量和方法的区别(美团 / 字节跳动 / 网易)
- final、finally、finalize(美团 / 华为 / 字节跳动)
- static 和 final 关键字有什么区别,分别能修饰什么?(百度 / 美团 / 蚂蚁)
- Java static 关键字有什么作用?(字节跳动 / 携程 / 美团)
- Java 的值传递和引用传递有什么区别?(哔哩哔哩 / 字节跳动 / 美团)
- Java 异常分为哪几类?(小米 / 快手 / 美团)
- Java 异常体系的继承结构是怎样的?(快手 / 美团 / 字节跳动)
- Java 异常处理机制是什么?(阿里 / 京东 / 华为)
- try 中 return 后 finally 也 return,最终返回什么?(美团 / 京东 / 阿里)
- Java 序列化和反序列化(快手 / 滴滴 / 美团)
- Java 泛型和泛型擦除是什么?(字节跳动 / 快手 / 小米)
- 说说java 泛型(美团 / 拼多多 / 百度)
- Java 8 有哪些新特性?(京东 / 美团 / 华为)
- lambda表达式是什么?(华为 / 百度 / 小米)
- Java 对象是如何创建的?(腾讯 / 字节跳动 / 滴滴)
- Java 单例模式(美团 / 百度 / 腾讯)
- Java 面向对象有哪些特点?(百度 / 华为 / 美团)
- JDK与JVM是什么关系?(滴滴 / 京东 / 华为)
- Go 和 Java 有哪些主要区别?(字节跳动 / 百度 / 美团)
- Python 和 Java 的主要区别是什么?(字节跳动 / 腾讯 / 美团)
- JDK、JRE 和 JVM 分别是什么,三者是什么关系
- Java 为什么说是跨平台的,"一次编译,到处运行"靠什么实现
- Integer 缓存池是什么,Integer 128 == 128 为什么是 false
- 自动装箱和拆箱的原理是什么,会带来什么坑
- String 为什么设计成不可变的,不可变有什么好处
- 字符串常量池在 JDK 各版本里的位置变化
- String 的 intern 方法做了什么
- BigDecimal 为什么能避免精度丢失,为什么不能用 double 构造
- 浅拷贝和深拷贝有什么区别,怎么实现深拷贝
- Object 类有哪些方法,wait 和 sleep 的区别
- 接口里的 default 方法和 static 方法解决了什么问题
- 内部类有哪几种,匿名内部类为什么只能访问 final 或事实 final 的变量
- Error 和 Exception 的区别,受检异常和非受检异常怎么选
- Optional 的设计意图是什么,哪些用法是反模式
- Stream 流的惰性求值是什么,并行流有哪些坑
- Java 8 之后各版本(11、17、21)有哪些值得讲的特性,虚拟线程解决什么问题
- fail-fast 和 fail-safe 迭代器有什么区别
- Java 中的 SPI 机制是什么,和 API 的区别
- equals 重写需要遵守哪些约定
- 什么是 Java 的语法糖,举几个例子
面试官问「线程池的核心参数有哪些?任务提交后是怎么执行的?」,看浮窗当场给你什么
面试官一开口,浮窗就出要点和能直接念的回答,被追问也接得住。共享屏幕时对面看不见。
核心要点 核心线程数、最大线程数、存活时间、阻塞队列、线程工厂、拒绝策略、先核心线程再入队再扩到最大线程最后拒绝、有界队列、按任务类型设置线程数
参考回答 线程池有七个参数:核心线程数、最大线程数、空闲存活时间、时间单位、阻塞队列、线程工厂和拒绝策略。任务提交后的顺序是:先看核心线程有没有空位,没有就放进阻塞队列,队列满了再扩容到最大线程数,最大线程数也满了才触发拒绝策略。所以队列用无界队列时最大线程数形同虚设,生产环境建议用有界队列并自定义拒绝策略,线程数按 CPU 密集还是 IO 密集来估算。
集合框架
- Java常用的集合类(美团 / 快手 / 小米)
- Java 容器有哪些?(华为 / 美团 / 快手)
- ArrayList 和 LinkedList 的使用场景分别是什么?(美团 / 字节跳动 / 得物)
- ArrayList初始容量及扩容机制是什么?(美团 / 小米 / 京东)
- ArrayList 和数组有什么区别?(美团 / 京东 / 华为)
- 如何让ArrayList线程安全?(京东 / 美团 / 字节跳动)
- HashMap 的底层结构是什么?(美团 / 字节跳动 / 快手)
- HashMap 的底层实现是什么?JDK 1.7 和 1.8 有什么区别?(京东 / 美团 / 腾讯)
- HashMap 扩容机制是什么?(腾讯 / 字节跳动 / 美团)
- HashMap 的 put 方法执行流程是什么?(美团 / 字节跳动 / 百度)
- HashMap 如何解决哈希冲突?(美团 / 腾讯 / 京东)
- HashMap 链表转红黑树的阈值为什么是 8,退化阈值为什么是 6?(腾讯 / 拼多多 / 字节跳动)
- 为什么HashMap选择红黑树而非普通二叉搜索树/平衡二叉树?(快手 / 字节跳动 / 美团)
- HashMap的容量为什么是2的n次方?(美团 / 腾讯 / 百度)
- HashMap 的负载因子为什么默认是 0.75?(快手 / 美团 / vivo)
- HashMap 扩容为什么不能是 3 倍或 4 倍?(阿里 / 美团 / 快手)
- HashMap 原理和 key 要求(美团 / 华为 / 字节跳动)
- HashMap 是否线程安全?多线程使用会有什么问题?(美团 / 腾讯 / 拼多多)
- 为什么 Java HashMap 不是线程安全的?(快手 / 蚂蚁 / 字节跳动)
- 线程安全的HashMap都有哪些(字节跳动 / 快手 / 携程)
- hashtable和hashmap的区别(美团 / 滴滴 / 百度)
- HashMap 与 TreeMap 的区别是什么(拼多多 / 腾讯 / 快手)
- HashMap 和 ConcurrentHashMap 有什么区别?(美团 / 快手 / 腾讯)
- ConcurrentHashMap 的底层实现是什么?它如何保证线程安全?(美团 / 快手 / 字节跳动)
- JDK 8 ConcurrentHashMap 如何保证线程安全?(美团 / 快手 / 腾讯)
- ConcurrentHashMap 在 JDK 1.7 和 1.8 中的实现有什么区别?(京东 / 快手 / 美团)
- ConcurrentHashMap 的 get 方法是否需要加锁?(拼多多 / 字节跳动 / 快手)
- ConcurrentHashMap 的 size 方法是如何实现的?(拼多多 / 百度 / 字节跳动)
- HashTable 和 ConcurrentHashMap 都是线程安全的,有什么区别?(快手 / 腾讯 / 华为)
- Java 常用数据结构有哪些?(美团 / 腾讯 / 得物)
- HashSet 如何保证元素不重复,和 HashMap 是什么关系
- LinkedHashMap 的底层结构是什么,怎么用它实现 LRU
- TreeMap 和 TreeSet 的排序是怎么实现的,Comparable 和 Comparator 的区别
- CopyOnWriteArrayList 的实现原理和适用场景
- HashMap 的 hash 函数为什么要做高位异或(扰动函数)
- HashMap 1.7 头插法在多线程扩容时为什么会死循环
- ConcurrentHashMap 为什么不允许 key 和 value 为 null
- ConcurrentHashMap 的扩容是怎么多线程协助完成的
- Collections.synchronizedMap 和 ConcurrentHashMap 有什么区别
- ArrayList 的 modCount 是做什么用的,遍历时删除元素为什么会抛异常
- PriorityQueue 的底层结构是什么,怎么实现大顶堆
- ArrayDeque 和 LinkedList 做队列、栈时怎么选
- BlockingQueue 有哪些实现,ArrayBlockingQueue 和 LinkedBlockingQueue 的区别
- Arrays.asList 返回的列表有什么限制
- WeakHashMap 的使用场景
线程与线程池
- Java 创建线程有哪些方式?(美团 / 百度 / 腾讯)
- 线程有哪些创建方式,不同方式有什么区别?(华为 / 美团 / 字节跳动)
- 线程的状态有哪些?(美团 / 腾讯 / 百度)
- 线程状态转换(具体方法)(快手 / 阿里 / 小米)
- 什么是线程安全,如何保证线程安全?(美团 / 字节跳动 / 快手)
- 多线程中线程间通信方式有哪些?(腾讯 / 字节跳动 / 快手)
- 线程同步有哪些常见方式?(腾讯 / 百度 / 字节跳动)
- 主线程如何等待所有子线程执行完成?(百度 / 京东 / 腾讯)
- i++ 为什么不是线程安全的?(字节跳动 / 百度 / 得物)
- 线程池的主要参数(美团 / 快手 / 京东)
- 线程池底层原理(美团 / 字节跳动 / 快手)
- 线程池的拒绝策略有哪些?(美团 / 京东 / 快手)
- 线程池阻塞队列、拒绝策略(美团 / 百度 / 华为)
- 线程池任务提交后的执行流程是什么?(美团 / 京东 / 小米)
- 为什么要有线程池(美团 / 字节跳动 / 阿里)
- 如何设计一个线程池?(美团 / 字节跳动 / 腾讯)
- 创建线程池有哪几种方法?(网易 / 字节跳动 / 京东)
- Java 线程池有哪些类型?通常如何创建?(腾讯 / 美团 / 京东)
- 怎么设置线程池的数量(拼多多 / 携程 / 美团)
- 如何估算线程池线程数?(小红书 / 美团 / 拼多多)
- 如何动态调整线程池参数?(快手 / 拼多多 / 京东)
- 线程池 submit 和 execute 方法有什么区别?(美团 / 京东 / 快手)
- 线程池中线程执行任务抛出异常后会如何处理?(携程 / 滴滴 / 快手)
- 线程池有哪些状态?(京东 / 快手 / 携程)
- 哪些场景适合使用线程池?为什么要使用线程池?(百度 / 美团 / 京东)
- 线程池用过吗?(京东 / 美团 / 字节跳动)
- Executors 创建线程池为什么不推荐,阿里规范怎么说
- 线程池里 shutdown 和 shutdownNow 的区别
- 核心线程数能不能回收,allowCoreThreadTimeOut 是做什么的
- Callable、Future 和 FutureTask 的关系
- CompletableFuture 怎么做异步编排,和 Future 比好在哪
- CountDownLatch、CyclicBarrier、Semaphore 分别解决什么问题
- sleep、wait、yield、join 的区别
- wait 和 notify 为什么必须在同步块里调用
- 守护线程是什么,JVM 什么时候退出
- 线程中断 interrupt 的机制,怎么优雅停止一个线程
- 如何排查线上死锁,jstack 怎么看
- CPU 密集型和 IO 密集型任务线程池怎么配置
- ForkJoinPool 的工作窃取是什么
- 生产者消费者模型用 Java 怎么实现
- 虚拟线程和平台线程的区别
锁、volatile、CAS 与 AQS
- synchronized的底层实现原理是什么?(美团 / 字节跳动 / 腾讯)
- synchronized 锁升级过程是什么?(美团 / 快手 / 滴滴)
- synchronized锁静态方法和普通方法区别(字节跳动 / 美团 / 阿里)
- synchronized可作用于哪些地方?(小米 / 字节跳动 / 腾讯)
- reentrantlock和synchronized区别(美团 / 快手 / 字节跳动)
- synchronized 和 ReentrantLock 有什么区别?什么场景下用哪个?(美团 / 百度 / 字节跳动)
- synchronized 和 volatile 的作用与区别是什么?(美团 / 字节跳动 / 百度)
- synchronized关键字与AQS的关系和区别(美团 / 快手 / 字节跳动)
- ReentrantLock 公平锁与非公平锁实现原理是什么?(快手 / 美团 / 字节跳动)
- ReentrantLock 是怎样实现的?(京东 / 美团 / 快手)
- Java中的锁(快手 / 美团 / 字节跳动)
- 乐观锁与悲观锁的核心区别、实现方式(CAS/synchronized)及适用场景?(字节跳动 / 美团 / 蚂蚁)
- volatile的作用(美团 / 字节跳动 / 百度)
- volatile能否保证原子性,为什么?(美团 / 华为 / 字节跳动)
- volatile底层怎么实现的(拼多多 / 腾讯 / 字节跳动)
- volatile 如何保证可见性并限制指令重排?(字节跳动 / 美团 / 快手)
- volatile 在单例模式的作用(快手 / 美团 / 字节跳动)
- volatile 什么场景必须用?只在多线程里用吗?(百度 / 字节跳动 / 拼多多)
- JMM内存模型是什么?(美团 / 腾讯 / 滴滴)
- CAS 是什么?ABA 问题如何解决?(腾讯 / 字节跳动 / 携程)
- CAS和synchronized锁的区别是什么?(拼多多 / 百度 / 腾讯)
- 说下AQS。(快手 / 京东 / 百度)
- AQS和CAS(美团 / 携程 / OPPO)
- ThreadLocal 有什么作用?原理是什么,怎么实现线程隔离?(美团 / 腾讯 / 快手)
- ThreadLocal 的底层实现是什么?(美团 / 快手 / 字节跳动)
- 使用ThreadLocal有哪些注意点(京东 / 快手 / 拼多多)
- ThreadLocalMap 的 Key 为什么设计成弱引用?(美团 / 字节跳动 / 小红书)
- ThreadLocal 会遇到哪些问题?(美团 / 携程 / 小红书)
- Java 如何保证并发安全?(腾讯 / 美团 / OPPO)
- Happens-Before 原则有哪些
- 指令重排序有哪几种,as-if-serial 语义是什么
- 偏向锁、轻量级锁、重量级锁分别在什么场景生效,偏向锁为什么在新版本里被废弃
- synchronized 是可重入的吗,可重入是怎么实现的
- Lock 的 lockInterruptibly 和 tryLock 有什么用
- Condition 和 Object.wait/notify 的区别
- ReentrantReadWriteLock 的读写锁是怎么实现的,会有写饥饿吗
- StampedLock 比读写锁快在哪里
- Atomic 原子类的底层实现,LongAdder 为什么比 AtomicLong 快
- 无锁编程里除了 CAS 还有哪些手段
- AQS 的同步队列是什么结构,节点是怎么入队和唤醒的
- 死锁的四个必要条件,Java 里怎么避免
- InheritableThreadLocal 解决什么问题,线程池下怎么传递上下文
- 自旋锁的优缺点,自适应自旋是什么
- 分段锁是什么,在 JDK 各版本里怎么演进
JVM 内存与对象
- Java的内存结构(美团 / 字节跳动 / 京东)
- JVM内存区域如何划分?(美团 / 腾讯 / 快手)
- JVM内存结构及各部分作用是什么?(美团 / 腾讯 / 快手)
- JVM 运行时数据区由哪些部分组成?各自作用是什么?(快手 / 滴滴 / 美团)
- JVM的内存模型是什么?(美团 / 华为 / 快手)
- JVM 中哪些区域是线程私有的,哪些是线程共享的?(百度 / 网易 / 美团)
- 堆内存和栈内存(字节跳动 / 腾讯 / 华为)
- JVM 由哪些部分组成?(百度 / vivo / 京东)
- JVM OOM 可能发生在哪些区域?(美团 / 华为 / 快手)
- Java会出现内存泄漏吗?什么场景下会出现?(华为 / 腾讯 / 网易)
- Java 四种引用类型是什么?(字节跳动 / 腾讯 / 美团)
- Java 对象是如何创建的?(腾讯 / 字节跳动 / 滴滴)
- 对象在内存里的布局是什么样的,对象头里存了什么
- 对象创建时怎么在堆上分配内存,指针碰撞和空闲列表的区别
- TLAB 是什么,解决了什么问题
- 什么是逃逸分析,栈上分配和标量替换
- 元空间和永久代有什么区别,为什么要替换
- 直接内存是什么,什么场景会 OOM
- 栈帧里有哪些内容,StackOverflowError 是怎么来的
- JIT 即时编译器是什么,热点代码怎么判定
- 对象的访问定位有哪两种方式,句柄和直接指针
- 对象从新生代晋升到老年代的条件有哪些
- 字符串常量池放在哪里,运行时常量池又是什么
- Java 中的内存泄漏有哪些典型场景
- JVM 的解释执行和编译执行是怎么配合的
垃圾回收与调优排查
- 垃圾回收算法(美团 / 腾讯 / 快手)
- Java 垃圾回收机制是什么?(腾讯 / 美团 / 字节跳动)
- 哪些对象可以作为 GC Roots?(百度 / 字节跳动 / 美团)
- JVM如何判断对象是否死亡?(美团 / 字节跳动 / 小米)
- 有哪些垃圾回收器?(美团 / 京东 / 百度)
- 垃圾回收算法及常见垃圾回收器对应算法有哪些?(美团 / 快手 / 字节跳动)
- CMS、G1、ZGC 有什么区别?(美团 / 阿里巴巴 / OPPO)
- G1 垃圾回收器的设计原理是什么?(百度 / OPPO / 京东)
- JVM 的分代回收机制是怎样的?(快手 / 腾讯 / 字节跳动)
- minGC和fullGC触发条件(美团 / 蚂蚁 / 华为)
- 线上 Full GC 如何排查?(美团 / 字节跳动 / 快手)
- 开发中如何排查 OOM 问题?(字节跳动 / 快手 / 京东)
- JVM调优的思路(华为 / 美团 / 阿里)
- JVM调优,你还记得哪些参数?(美团 / 华为 / 小红书)
- JVM 问题排查常用命令有哪些?(腾讯 / 华为 / 网易)
- Java内存泄漏如何排查?(华为 / 小米 / 腾讯)
- CMS 垃圾回收器的几个阶段是什么,有哪些缺点
- ZGC 的染色指针和读屏障是什么
- 三色标记法是什么,漏标是怎么解决的
- Young GC 频繁怎么办,Stop The World 怎么缩短
- CPU 飙高怎么定位到具体代码行
- 如何分析 dump 文件,MAT 里重点看什么
- Parallel Scavenge 和 ParNew 的区别,JDK 8 默认用哪个
- Serial、Parallel、CMS、G1 分别适合什么场景
- 如何选择堆大小,Xms 和 Xmx 为什么建议设成一样
- GC 日志怎么看,哪些指标最需要关注
- Arthas 常用命令有哪些,线上怎么用它定位问题
- 什么是内存溢出,什么是内存泄漏,两者怎么关联
类加载、反射、代理与 IO
- 类加载机制是什么?(美团 / 京东 / 华为)
- 类加载过程有哪几个阶段?(美团 / 字节跳动 / 快手)
- 类加载器有几种(京东 / 快手 / OPPO)
- 类加载的双亲委派机制是什么?(美团 / 腾讯 / 百度)
- 什么是双亲委派模型?解决了什么问题?什么场景需要打破?(美团 / 网易 / 字节跳动)
- Java为什么要做双亲委派(字节跳动 / 京东 / 快手)
- 怎么破坏双亲委派模型?(美团 / 字节跳动 / 快手)
- Java 反射是什么?有哪些应用场景?(美团 / 腾讯 / 字节跳动)
- 反射是什么,运用场景,有什么缺点(美团 / 快手 / 京东)
- 反射是怎么实现的(快手 / 京东 / 小米)
- Java的动态代理(字节跳动 / 快手 / 美团)
- JDK 动态代理和 CGLIB 有什么区别?(美团 / 字节跳动 / 快手)
- Java IO、NIO 和 BIO 有什么区别?(美团 / 华为 / 字节跳动)
- BIO、NIO、AIO分别是什么?(美团 / 携程 / 京东)
- 类初始化的触发时机有哪些,静态代码块的执行顺序
- 父子类、静态块、构造块的初始化顺序
- 自定义类加载器怎么写,Tomcat 为什么要打破双亲委派
- 一个类被加载两次会发生什么,类的唯一性由什么决定
- 反射为什么慢,怎么优化(MethodHandle、缓存)
- 注解的原理是什么,如何自定义注解并解析
- 动态代理在 RPC 和 Spring 里分别怎么用
- NIO 的 Selector、Channel、Buffer 分别是什么
- 零拷贝在 Java 里怎么实现,transferTo 和 mmap
- Java 的 IO 流体系是怎么分类的
- 序列化中 serialVersionUID 的作用
- SPI 与双亲委派的矛盾,线程上下文类加载器怎么解决
Spring IoC 与 Bean
- Spring IOC是什么?(美团 / 腾讯 / 字节跳动)
- Spring IoC 容器的核心原理是什么?(华为 / 滴滴 / 百度)
- 说一下IOC底层是如何实现的(美团 / 腾讯 / 携程)
- BeanFactory和ApplicationContext有什么差异(字节跳动 / 美团 / 字节)
- BeanFactory 和 FactoryBean 有什么区别?(美团 / 百度 / 京东)
- Spring Bean 有哪些依赖注入方式?(华为 / 美团 / 阿里)
- Spring 如何实现依赖注入?(字节跳动 / 华为 / 快手)
- Spring bean的生命周期管理(美团 / 百度 / 蚂蚁)
- Spring Bean 的生命周期是什么,有哪些可用 hook?(美团 / 字节跳动 / 小红书)
- Spring Bean 的初始化流程是什么?(字节跳动 / 美团 / 字节)
- Spring Bean加载过程(快手 / 阿里 / 滴滴)
- Spring 容器的启动流程(百度 / 美团 / 小米)
- Spring Bean 的作用域有哪些?(美团 / 京东 / 华为)
- bean是单例还是多例,是线程安全的吗(百度 / 美团 / 京东)
- Spring 循环依赖如何解决?(美团 / 字节跳动 / 快手)
- Spring 解决循环依赖的三级缓存分别是什么?(美团 / 百度 / 快手)
- Spring 中常用哪些设计模式?(京东 / 百度 / 美团)
- Spring源码了解过吗?(京东 / 滴滴 / 小米)
- spring用过什么注解(百度 / 美团 / 京东)
- @Autowired 和 @Resource 的区别
- 构造器注入、setter 注入和字段注入各自适合什么场景
- 三级缓存为什么不能只用二级缓存
- 构造器注入的循环依赖为什么无法解决,@Lazy 怎么破局
- BeanPostProcessor 和 BeanFactoryPostProcessor 的区别
- @Component、@Service、@Repository 有什么区别
- @Configuration 和 @Component 的区别(CGLIB 代理)
- Spring 的事件机制(ApplicationEvent)怎么用
- @Conditional 系列注解的原理
- @Scope 的 prototype 注入单例 Bean 时会有什么问题
- Spring 里的单例 Bean 是怎么实现的
- FactoryBean 在 MyBatis 集成里扮演什么角色
- ApplicationContext 的 refresh 方法做了哪些事
- @PostConstruct、InitializingBean、init-method 的执行顺序
Spring AOP、事务与 MVC
- Spring AOP 的原理是什么?(美团 / 阿里 / 字节跳动)
- Spring IoC 和 AOP 分别是什么?(美团 / 华为 / 腾讯)
- aop怎么实现(美团 / 字节跳动 / 快手)
- AOP 的应用场景有哪些?(字节跳动 / 哔哩哔哩 / 滴滴)
- AOP有哪几种实现方式?(百度 / 美团 / 京东)
- 了解 AOP 吗?怎么实现的?CGLIB 和 JDK 动态代理有啥区别?CGLIB 具体是怎么做的?(滴滴 / 百度 / 京东)
- Spring 事务传播机制有哪些?(美团 / 京东 / 腾讯)
- Spring 声明式事务在哪些情况下会失效?(京东 / 蚂蚁 / 华为)
- @Transactional 注解在哪些场景会失效,怎么解决
- SpringMVC的原理(百度 / 京东 / 美团)
- Spring MVC 的工作流程是什么?(美团 / 京东 / 快手)
- AOP 里的切面、切点、通知、连接点分别是什么
- 五种通知类型的执行顺序(Around、Before、After、AfterReturning、AfterThrowing)
- 同一个类里方法自调用为什么会让 AOP 和事务失效,怎么解决
- Spring 默认什么时候用 JDK 代理,什么时候用 CGLIB
- 事务隔离级别在 Spring 里怎么设置,和数据库隔离级别的关系
- 事务回滚的规则是什么,为什么默认只回滚运行时异常
- 嵌套事务 NESTED 和 REQUIRES_NEW 的区别
- @Transactional 加在 private 方法上会怎样
- 事务里异步调用、多线程为什么拿不到同一个事务
- 拦截器(Interceptor)和过滤器(Filter)的区别
- DispatcherServlet 的执行流程里 HandlerMapping 和 HandlerAdapter 各做什么
- @RestController 和 @Controller 的区别
- 全局异常处理 @ControllerAdvice 的原理
- 参数绑定 @RequestBody、@RequestParam、@PathVariable 的区别
- AOP 在项目里怎么落地(日志、权限、限流、幂等)
Spring Boot 与微服务
- Spring Boot 自动装配原理是什么?(小米 / 美团 / 百度)
- Spring和SpringBoot区别(美团 / 京东 / 快手)
- SpringBoot的注解介绍一下(滴滴 / 美团 / 网易)
- SpringBoot Starter自动装配(百度 / 网易 / 美团)
- 说一下springboot的启动流程(美团 / 阿里 / 快手)
- SpringBoot的优点(京东 / 华为 / 字节跳动)
- 如何写一个Spring Boot Starter?(字节跳动 / 百度 / 小米)
- Spring Boot 的启动核心注解有哪些?(百度 / 腾讯 / 京东)
- springboot事务实现(小米 / 京东 / 华为)
- Spring Boot 和 Spring Cloud 有什么区别?(美团 / 华为 / 腾讯)
- spring cloud和dubbo有什么区别?(美团 / 京东 / 华为)
- Spring Boot 启动类用到了哪些设计模式?(美团 / 华为 / 京东)
- @SpringBootApplication 由哪几个注解组成
- spring.factories 和 AutoConfiguration.imports 的区别(Boot 3 的变化)
- Spring Boot 配置文件加载顺序和优先级
- 内嵌 Tomcat 是怎么启动的
- Spring Boot 怎么做多环境配置,Profile 的原理
- Actuator 能监控什么,生产上怎么用
- Spring Boot 2 升级到 3 要注意什么(Jakarta、Java 17)
- Spring Boot 项目启动慢怎么优化
- 注册中心、配置中心、网关各解决什么问题
- 服务熔断、降级、限流的区别,Sentinel 和 Hystrix 怎么选
- Feign 的调用流程,负载均衡是怎么做的
- Spring Cloud Gateway 的工作原理
- 分布式事务在 Spring Cloud 里有哪些方案(Seata、TCC、本地消息表)
- 接口幂等性怎么保证
MyBatis
- MyBatis 中 #{} 和 ${} 有什么区别及安全隐患?(美团 / 华为 / 百度)
- MyBatis 如何防止 SQL 注入?(腾讯 / 华为 / 字节跳动)
- MyBatis的工作原理(美团 / 小米 / 快手)
- MyBatis 如何实现分页?(美团 / 华为 / 京东)
- mybatis缓存(腾讯 / 华为 / 京东)
- MyBatis和MyBatis-Plus的区别和联系是什么?(美团 / 京东 / 小米)
- MyBatis 的一级缓存和二级缓存分别在什么范围生效,什么时候失效
- Mapper 接口没有实现类,为什么能被调用(动态代理)
- MyBatis 的 Executor 有哪几种类型
- resultMap 和 resultType 的区别,字段名和属性名不一致怎么映射
- MyBatis 怎么做批量插入,性能怎么优化
- 动态 SQL 的标签有哪些,底层怎么解析
- MyBatis 的插件机制拦截哪几个对象
- MyBatis 与 Spring 整合时 SqlSession 是怎么保证线程安全的
- MyBatis-Plus 的 BaseMapper 是怎么实现通用 CRUD 的
- 延迟加载(懒加载)的原理
- 一对多、多对多关联查询在 MyBatis 里怎么写,N+1 问题怎么解决
- Mybatis 的 TypeHandler 做什么用
- MyBatis 和 Hibernate/JPA 怎么选
手撕题与场景编码
- 两个线程交替打印 1-100 的奇数和偶数(小米 / 小红书 / 百度)
- 如何实现两个线程交替打印数字和字母?(哔哩哔哩 / 滴滴 / 美团)
- 如何手写线程安全的懒汉式单例模式?(字节跳动 / 快手 / 滴滴)
- 给出一个单例模式(线程安全)的实现。(字节跳动 / 拼多多 / 美团)
- 如何实现一个线程安全的 LRU 缓存?(字节跳动 / 腾讯 / 华为)
- 用 wait/notify 手写一个生产者消费者模型
- 用 ReentrantLock + Condition 实现一个有界阻塞队列
- 手写一个简易线程池(核心线程、队列、拒绝策略)
- 用 LinkedHashMap 实现 LRU 缓存
- 三个线程按顺序依次打印 ABC 各 10 次
- 实现一个带过期时间的本地缓存
- 手写一个简化版的 HashMap(数组 + 链表)
- 用 CountDownLatch 实现多个任务并发执行后汇总结果
- 实现一个简单的令牌桶或滑动窗口限流器
- 手写双重检查锁单例并解释每一处 volatile 和 synchronized
- 写一个会导致死锁的例子并给出修复方式
备考重点
Java 八股的特点是知识点离散、追问爱往源码和线上现象上落。但把它们挂到同一条主线上就清晰了:语言层面有对象、集合和异常;多线程要保证安全,所以有锁、volatile、CAS 和线程池;程序跑在 JVM 上,所以有内存区域、垃圾回收和类加载;业务代码交给 Spring 管理,所以有 IoC、AOP、事务和 Boot 的自动装配;数据落库靠 MyBatis。这条主线讲通,零散的题会自己串起来。
建议按这个顺序准备:先把 HashMap 和 ConcurrentHashMap 的结构、扩容、并发问题讲清,再吃透 synchronized、volatile、AQS 与线程池,然后是 JVM 内存区域、垃圾回收算法与收集器,最后补 Spring 循环依赖、Bean 生命周期、AOP 与事务失效、Boot 自动装配。 面试里最容易丢分的不是不会,而是把 JDK 7 和 JDK 8 的实现混在一起,或者把"volatile 保证可见性"说成"volatile 保证线程安全"。
线程池、锁和 Spring 事务是拉开差距的三块。别只背参数名和注解名,要能讲出:任务提交后先核心线程、再队列、再最大线程、最后拒绝的完整顺序,以及队列选型怎么影响最大线程数;synchronized 从偏向锁到重量级锁的升级条件,和 ReentrantLock 在可中断、公平性、条件队列上的区别;事务失效的几种典型场景(自调用、非 public、异常被吞、传播属性),以及为什么会这样。能把"现象 → 原因 → 怎么排查"讲成一条线,比背标准答案更容易拿分。
常见问题
这份题单是怎么整理出来的?
来源是公开面经与题库沉淀,把 Java 方向反复出现的八股题抽出来重新归类,不包含面灵用户的面试内容。括号里标注的是近期实际问过这道题的大厂,只作参考,不代表完整名单。
Java 面试八股应该先准备哪些部分?
优先顺序建议是:集合(HashMap 与 ConcurrentHashMap)→ 线程池 → synchronized、volatile 与 AQS → JVM 内存与垃圾回收 → Spring 循环依赖与事务 → 类加载与反射 → Spring Boot 自动装配 → MyBatis。前五块是各大厂 Java 岗的公共必考区,后面几块再按目标岗位和简历上写的项目补。
HashMap 面试一般会追问到什么程度?
通常是四层:先问底层结构和 put 流程,再追问扩容机制、为什么链表转红黑树的阈值是 8、容量为什么是 2 的幂,然后问线程不安全体现在哪里,最后落到 ConcurrentHashMap 在 JDK 7 和 JDK 8 里怎么保证线程安全。能把 JDK 7 与 JDK 8 的差异分开讲,是这一块最稳的得分点。
Java 里 synchronized 和 ReentrantLock 怎么选?
两者都可重入,都能保证互斥与可见性。synchronized 由 JVM 实现,使用简单,异常时自动释放,JDK 6 之后有锁升级优化;ReentrantLock 基于 AQS,多了可中断获取、超时获取、公平锁和多个条件队列,但必须在 finally 里手动释放。竞争不激烈、逻辑简单时优先 synchronized,需要可中断、超时或多条件等待时用 ReentrantLock。
更多岗位合集
操作系统面试题与八股文汇总:290+ 道进程线程、内存管理、死锁、IPC、零拷贝、Linux 命令高频真题分类整理(2026 面经)
面灵AI整理的操作系统八股合集,覆盖进程与线程、协程、调度算法、进程间通信、锁与死锁、虚拟内存与页表、内存泄漏与 OOM、零拷贝与 Linux 线上排查,标注近期出题的大厂。
计算机网络面试题与八股文汇总:300+ 道 TCP、UDP、HTTP、HTTPS、DNS、IO 多路复用高频真题分类整理(2026 面经)
面灵AI整理的计算机网络八股合集,覆盖网络分层、TCP 三次握手四次挥手、拥塞控制、TIME_WAIT、HTTP 各版本、HTTPS、DNS、WebSocket 与 epoll,标注近期出题的大厂。
Redis面试题与八股文汇总:230+ 道数据结构、持久化、缓存三大问题、一致性、分布式锁、高可用高频真题分类整理(2026 面经)
面灵AI整理的 Redis 八股合集,覆盖数据结构、线程模型、RDB 与 AOF、过期淘汰、缓存穿透击穿雪崩、缓存一致性、分布式锁、主从哨兵集群与 LRU 手撕,标注近期出题的大厂。