JavaJava后端开发面试真题Java八股

Java面试题与八股文汇总:380+ 道集合、并发、JVM、Spring、MyBatis 高频真题分类整理(2026 面经)

面灵AI整理的 Java 八股合集,覆盖基础与面向对象、HashMap 与 ConcurrentHashMap、线程池、synchronized 与 AQS、JVM 与 GC、类加载、Spring、Spring Boot、MyBatis 和手撕题,标注近期出题的大厂。

收录题目
388 道
统计周期
截至 2026 年 11 月
近期出题公司字节跳动在招腾讯在招阿里巴巴美团在招京东在招快手华为百度小米滴滴在招
面灵AI
35 分钟阅读

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 的语法糖,举几个例子
面灵AI 面试助手

面试官问「线程池的核心参数有哪些?任务提交后是怎么执行的?」,看浮窗当场给你什么

面试官一开口,浮窗就出要点和能直接念的回答,被追问也接得住。共享屏幕时对面看不见。

腾讯会议文件编辑显示周一 14:32
腾讯会议 · Java 后端开发工程师 · 技术一面REC 00:10
面
面试官
我
面试官:
聆听中18:05
Ctrl+↑回看
Ctrl+↓看新
拖动分割线看面试官那一侧:共享屏幕、窗口录制、截图里都不会出现答案层
浮窗里这道题的回答

核心要点 核心线程数、最大线程数、存活时间、阻塞队列、线程工厂、拒绝策略、先核心线程再入队再扩到最大线程最后拒绝、有界队列、按任务类型设置线程数

参考回答 线程池有七个参数:核心线程数、最大线程数、空闲存活时间、时间单位、阻塞队列、线程工厂和拒绝策略。任务提交后的顺序是:先看核心线程有没有空位,没有就放进阻塞队列,队列满了再扩容到最大线程数,最大线程数也满了才触发拒绝策略。所以队列用无界队列时最大线程数形同虚设,生产环境建议用有界队列并自定义拒绝策略,线程数按 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。

想要一份属于你的题库?

按你的目标公司和岗位,定制专属高频题

这份合集是官方按岗位整理的通用版。告诉面灵AI 你要面的公司和岗位,结合你的简历,生成一份只属于你的近期高频题和参考回答。

面试实时辅助

下载面灵AI桌面客户端,面试 / 笔试时 AI 实时听题辅助作答。