Java 高级开发高频面试题
Java 高级开发的高频面试题,涵盖 Java 核心进阶、并发编程、JVM 虚拟机、分布式与框架深度、项目实战与架构设计五大模块。内容包括 HashMap 底层实现、ConcurrentHashMap 线程安全、线程池配置、JVM 内存模型与 GC 调优、Spring 循环依赖及事务管理、分布式事务方案等。旨在帮助中高级开发者梳理核心考点,提升面试通过率。

Java 高级开发的高频面试题,涵盖 Java 核心进阶、并发编程、JVM 虚拟机、分布式与框架深度、项目实战与架构设计五大模块。内容包括 HashMap 底层实现、ConcurrentHashMap 线程安全、线程池配置、JVM 内存模型与 GC 调优、Spring 循环依赖及事务管理、分布式事务方案等。旨在帮助中高级开发者梳理核心考点,提升面试通过率。

答案要点(面试满分版,分点必背)
拉链法 解决哈希冲突。ConcurrentHashMap 替代。答案要点
核心结论:ConcurrentHashMap 是 HashMap 的线程安全版,高并发场景下的首选 Map,JDK7 和 JDK8 实现完全不同,面试必问两者区别。
分段锁(Segment)+ 数组 + 链表
CAS + synchronized + 数组 + 链表 + 红黑树
CAS 原子操作保证并发安全,无锁开销,性能极高;synchronized 锁住当前哈希桶的首节点,锁粒度是节点级别(JDK8 的 synchronized 做了重量级锁→轻量级锁→偏向锁优化,性能不输 ReentrantLock);答案要点
✔ 核心区别(底层 + 性能 + 适用场景)
ArrayList 是动态数组,基于数组实现;LinkedList 是双向链表,基于链表实现。✔ ArrayList 扩容机制
new ArrayList<>(1000),避免频繁扩容。答案要点(面试标准答案,背会即可)
a.equals(b) = true,则 a.hashCode() 必须等于 b.hashCode();a.hashCode() = b.hashCode(),则 a.equals(b) 不一定为 true(哈希碰撞);a.equals(b) = false,则 a.hashCode() 可以相同 / 不同。HashMap/HashSet 等哈希集合时,会先通过 hashCode 定位哈希桶,再通过 equals 比较元素;✅ 核心:Java8 是 Java 史上最重要的版本,新增特性解决了 Java 函数式编程、并发效率、代码简洁性的痛点,高级开发必须吃透,回答时分点说核心特性 + 应用场景。
list.forEach(x -> System.out.println(x));@FunctionalInterface;optional.ifPresent().orElse().orElseGet();default 方法和 static 方法,解决接口的版本兼容问题(新增方法不影响实现类);答案要点
List<String>.class 编译报错;new ArrayList<String>[10] 编译报错;✅ 核心说明:并发编程是 Java 高级开发面试的绝对核心,占比最高、区分度最大,大厂面试必问,从基础的线程、锁到进阶的 AQS、CAS、线程池,全部是高频考点,必须吃透!
答案要点(标准答案,4 种方式,按推荐度排序)
答案要点(面试满分版,分点必背)
✔ volatile 核心三大作用(Java 并发的基石)
✔ volatile 实现原理
底层通过内存屏障 (Memory Barrier) 实现:
✔ 为什么 volatile 不能保证原子性?
原子性是指「一个操作要么全部执行成功,要么全部失败」,volatile 只能保证可见性和有序性,无法保证复合操作的原子性。
i++ 是复合操作(读 i→加 1→写 i),即使 i 被 volatile 修饰,多线程下依然会出现线程安全问题,最终结果小于预期值;synchronized / ReentrantLock / AtomicInteger(CAS 原子类)。✔ volatile vs synchronized 核心区别【必考】
答案要点(CAS 是并发编程的核心,必须吃透)
✔ CAS 定义
CAS = Compare And Swap(比较并交换),是一种无锁的原子操作,是 Java 并发包(java.util.concurrent.atomic)的底层实现原理,核心思想是「无锁并发,乐观锁思想」。
✔ CAS 核心原理
CAS 有 3 个核心参数:内存地址 V、旧的预期值 A、新值 B。
✔ CAS 的优点 & 缺点
✅ 优点:无锁机制,无需加锁释放锁,没有线程上下文切换的开销,并发量低时性能极高;❌ 缺点:
✔ ABA 问题 & 解决方案【核心】
AtomicStampedReference 和 AtomicMarkableReference,在 CAS 时不仅比较值,还比较版本号 / 标记位,只有值和版本号都一致时,才执行 CAS 操作,彻底解决 ABA 问题。答案要点(面试满分版,分点必背,坑点必答)
✔ ThreadLocal 核心定义 & 作用
ThreadLocal = 线程本地变量,核心作用是:为每个线程创建一个独立的变量副本,线程之间的变量互不干扰,彻底解决多线程下的变量共享问题。
✔ ThreadLocal 底层原理
ThreadLocalMap 成员变量,ThreadLocalMap 的 key 是弱引用的 ThreadLocal 对象,value 是线程的变量副本;✔ ThreadLocal 内存泄漏问题【核心坑点,面试必问】
remove() 方法,删除当前线程的变量副本;try { ... } finally { threadLocal.remove(); },保证无论是否异常,都会执行 remove;✅ 核心:线程池是生产环境的标配,面试必问核心参数 + 拒绝策略 + 配置方案,体现你的实战能力,这是加分项!
✔ 一、ThreadPoolExecutor 7 个核心参数(必背,按顺序说)
public ThreadPoolExecutor(int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 空闲线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 任务队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler) // 拒绝策略
✔ 二、4 种默认拒绝策略(必背,生产常用)
RejectedExecutionException 异常,拒绝任务,生产中不推荐,会导致业务报错;✔ 三、线程池的任务执行流程(必背)
✔ 四、如何合理配置线程池参数?【实战核心,面试加分】
✅ 核心原则:根据任务类型来配置,任务分为「CPU 密集型」和「IO 密集型」,两者配置完全不同。
核心线程数 = CPU 核心数 + 1(最优值);核心线程数 = CPU 核心数 * 2 或 CPU 核心数 / (1 - 阻塞系数)(阻塞系数 0.8~0.9);答案要点(精简版,面试够用,体现原理功底)
ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier、ReentrantReadWriteLock。答案要点
true 可以指定为公平锁:new ReentrantLock(true);✅ 核心说明:JVM 是 Java 高级开发的高薪门槛,初级开发问基础,中高级开发问内存模型 + 垃圾回收 + 调优 + 内存泄漏,大厂面试必问,能答出 JVM 调优的人,薪资至少上浮 20%!
答案要点(JDK8 版本,必背,分点清晰,面试满分)
JVM 运行时数据区分为 线程私有区域 和 线程共享区域,JDK8 移除了永久代,用元空间 (Metaspace) 替代,这是核心考点!
✔ 一、线程私有区域(每个线程独立创建,互不干扰)
StackOverflowError;栈内存不足→OutOfMemoryError(OOM);✔ 二、线程共享区域(所有线程共用,是 GC 的核心区域,面试重点)
-Xms(初始堆内存) 和 -Xmx(最大堆内存) 配置,生产中建议两者设置为相同值,避免频繁扩容。-XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 配置;
OutOfMemoryError: Metaspace。答案要点
✅ 核心:垃圾收集器是 JVM 调优的核心,面试必问 CMS 和 G1,这是目前生产环境的主流收集器,JDK9 后 G1 成为默认收集器。
✔ 一、主流垃圾收集器(按优先级排序)
✔ 二、CMS vs G1 核心区别(面试必答,满分答案)
-XX:MaxGCPauseMillis,保证 GC 停顿不超过指定时间;✔ 一、内存泄漏 vs 内存溢出(核心区别,面试必问)
OutOfMemoryError 异常,程序崩溃;
✔ 二、Java 中常见的内存泄漏场景(必背,生产高频)
static List/Map 持有对象的强引用,对象使用后不删除,导致永远无法被 GC 回收;close() 关闭,资源句柄被持有,导致内存泄漏;remove(),导致 value 无法被 GC 回收(前文已讲);✔ 三、内存泄漏 / 溢出的排查方案(生产实战,面试加分,必背)
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dump.hprof;jps(查看进程 ID)→ jstat(查看 GC 情况)→ jmap(导出堆快照)→ jhat(分析堆快照)。✔ 一、JVM 调优的核心思路(必背,分步骤,体现实战能力)
✅ 核心原则:先业务优化,后 JVM 调优,调优不是目的,目的是解决性能问题(如频繁 GC、OOM、响应慢),调优的核心是「减少 Full GC 的次数,降低 GC 的停顿时间」
✔ 二、常用的 JVM 调优参数(必背,生产高频)
-Xms2g -Xmx2g(初始堆 2G,最大堆 2G,推荐相等);-XX:NewRatio=2(新生代:老年代 = 1:2)、-XX:SurvivorRatio=8(Eden:S0:S1=8:1:1);-XX:+UseG1GC(使用 G1 收集器)、-XX:MaxGCPauseMillis=200(G1 最大停顿时间 200ms);-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:./gc.log(打印 GC 日志);-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m。答案要点(精简版,面试够用)
singletonObjects → 存放完全初始化的 Bean;earlySingletonObjects → 存放实例化完成、未初始化的早期 Bean;singletonFactories → 存放 Bean 的工厂对象,解决 AOP 代理的循环依赖;答案要点(高频 8 种,精简版)
readOnly=true 的只读事务。答案要点(按生产使用频率排序,必背)
答案要点(精简版,必背)
答案要点(分维度,必背,万能答案)
答案要点(按优先级排序,必背)

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online