2025年Java面试通关秘籍高频核心知识点全解析金三银四、金九银十面试季又来了你是否还在为Java面试发愁本文精心总结了Java面试中最高频、最核心的知识点覆盖Java基础、集合框架、多线程并发、JVM、Spring、MySQL、Redis等各大方向助你从容应对大厂面试一、Java基础篇1.1 面向对象三大特性| 特性 | 说明 | 面试要点 | |------|------|----------| |封装| 将数据和操作数据的方法绑定在一起对外隐藏实现细节 | 访问修饰符private、default、protected、public | |继承| 子类继承父类的属性和方法实现代码复用 | Java单继承、接口多实现、super关键字 | |多态| 同一个行为具有多个不同表现形式 | 重载编译时多态、重写运行时多态 |1.2 String 为什么是 final 的安全性防止被继承后修改字符串行为保证字符串常量池中的对象不可变效率不可变字符串可以被缓存、共享字符串常量池才得以实现线程安全不可变对象天然线程安全1.3 与 equals() 的区别| 对比维度 | | equals() | |---------|-----|----------| | 比较对象 | 基本类型比值引用类型比内存地址 | 默认比地址通常被重写为比值 | | 典型重写类 | - | String、Integer、Long 等包装类 |1.4 重载与重写的区别重载Overload同一个类中方法名相同参数列表不同与返回值无关重写Override子类对父类方法重新定义方法签名必须相同访问权限不能更严格二、集合框架篇2.1 HashMap 底层原理面试必问数据结构数组 链表 红黑树JDK 1.7数组 链表头插法JDK 1.8数组 链表 红黑树尾插法当链表长度 ≥ 8 且数组长度 ≥ 64 时转红黑树核心参数default_initial_capacity 16; // 默认初始容量 load_factor 0.75f; // 加载因子 TREEIFY_THRESHOLD 8; // 树化阈值put 流程计算 key 的 hashCode经过扰动函数后得到桶索引若该桶为空直接创建新节点若不为空判断 key 是否已存在存在则覆盖 value不存在则插入链表尾部 / 红黑树检查是否需要扩容size threshold扩容机制扩容为原容量的2 倍元素重新计算位置位置要么不变要么在原位置 原容量2.2 ConcurrentHashMap 如何保证线程安全重要| 版本 | 实现方式 | 锁粒度 | |------|----------|--------| | JDK 1.7 | Segment 数组 HashEntry 数组继承 ReentrantLock | 分段锁默认16个Segment | | JDK 1.8 | Node 数组 链表/红黑树 | CAS synchronized 锁桶节点 |JDK 1.8 核心机制空桶插入使用 CAS 无锁插入性能极高冲突插入使用 synchronized 锁住当前桶的头节点并发度理论上等于数组长度只要哈希不冲突不同线程可操作不同桶2.3 ArrayList 与 LinkedList 对比| 对比维度 | ArrayList | LinkedList | |---------|-----------|------------| | 底层结构 | 动态数组 | 双向链表 | | 随机访问 | O(1) | O(n) | | 插入/删除 | O(n)尾部O(1) | O(1)已知位置 | | 内存占用 | 连续内存较少 | 额外存储前后指针 | | 适用场景 | 频繁随机查询 | 频繁增删操作 |三、多线程与并发篇3.1 synchronized 原理JDK 1.6 之前重量级锁依赖 Mutex LockJDK 1.6 之后锁升级无锁 → 偏向锁 → 轻量级锁 → 重量级锁// 锁的四种状态 无锁 --------- 偏向锁 --------- 轻量级锁 --------- 重量级锁 标记对象 只有一个线程 少量竞争 大量竞争3.2 volatile 关键字可见性强制线程从主内存读取变量禁止线程工作内存缓存有序性禁止指令重排序内存屏障不保证原子性i 操作仍需加锁3.3 ThreadLocal每个线程持有自己的变量副本互不干扰底层Thread 类中有 ThreadLocalMap 属性内存泄漏风险使用完后务必调用remove()方法清除3.4 线程池核心参数7大参数| 参数 | 说明 | |------|------| | corePoolSize | 核心线程数 | | maximumPoolSize | 最大线程数 | | keepAliveTime | 空闲线程存活时间 | | unit | 时间单位 | | workQueue | 阻塞任务队列 | | threadFactory | 线程工厂 | | handler | 拒绝策略Abort、CallerRuns、Discard、DiscardOldest |线程池执行流程提交任务 → 核心线程满 → 队列满 → 最大线程满 → 拒绝策略四、JVM 篇4.1 JVM 内存区域划分| 区域 | 线程共享 | 作用 | |------|----------|------| | 堆Heap | ✅ 共享 | 存储对象实例GC 主要区域 | | 方法区Metaspace | ✅ 共享 | 存储类信息、常量、静态变量 | | 虚拟机栈 | ❌ 私有 | 存储局部变量表、操作数栈 | | 本地方法栈 | ❌ 私有 | 调用 native 方法 | | 程序计数器 | ❌ 私有 | 记录当前线程执行的字节码行号 |4.2 垃圾回收算法| 算法 | 原理 | 适用区域 | |------|------|----------| | 标记-清除 | 先标记垃圾再统一清除 | 老年代 | | 标记-复制 | 将内存分为两块只使用一块GC时将存活对象复制到另一块 | 新生代 | | 标记-整理 | 标记后所有存活对象向一端移动直接清理边界外内存 | 老年代 | | 分代收集 | 新生代用复制算法老年代用标记-整理或标记-清除 | 整堆 |4.3 常见 GC 调优参数-Xms4g # 初始堆大小 -Xmx4g # 最大堆大小 -Xmn2g # 新生代大小 -XX:MetaspaceSize256m -XX:UseG1GC # 使用 G1 垃圾回收器 -XX:PrintGCDetails # 打印 GC 日志五、Spring 框架篇5.1 Spring IoC 与 AOPIoC控制反转将对象的创建和管理交给 Spring 容器依赖注入方式构造器注入、Setter 注入、字段注入推荐构造器注入保证不可变性和可测试性AOP面向切面编程将日志、事务、权限等横切关注点从业务逻辑分离核心概念切面Aspect、连接点JoinPoint、通知Advice、切点Pointcut底层实现JDK 动态代理接口 CGLIB 代理类5.2 Spring 事务失效场景高频在同一个类中方法内部调用自调用代理不生效方法被final或static修饰抛出的异常类型与rollbackFor不匹配默认只回滚 RuntimeException数据库引擎不支持事务如 MyISAM多线程环境下事务不传递5.3 Spring Boot 自动配置原理SpringBootApplicationConfigurationEnableAutoConfigurationComponentScanEnableAutoConfiguration借助AutoConfigurationImportSelector加载META-INF/spring.factories中的自动配置类条件注解ConditionalOnClass、ConditionalOnMissingBean、ConditionalOnProperty等六、MySQL 篇6.1 索引相关索引类型| 类型 | 说明 | |------|------| | B 树索引 | InnoDB 默认支持聚簇索引 | | 哈希索引 | Memory 引擎等值查询快 | | 全文索引 | 用于大文本模糊匹配 | | 聚簇索引 | 叶子节点存储整行数据 | | 二级索引 | 叶子节点存储主键值需回表 |索引失效场景高频面试联合索引不满足最左前缀原则对索引列使用函数或运算使用 !、、or、not inlike 以 % 开头类型隐式转换例如字符串列不写引号6.2 MySQL 事务与隔离级别ACID 四大特性A原子性AtomicityC一致性ConsistencyI隔离性IsolationD持久性Durability四大隔离级别| 隔离级别 | 脏读 | 不可重复读 | 幻读 | |----------|:----:|:----------:|:----:| | READ UNCOMMITTED | ✅ | ✅ | ✅ | | READ COMMITTED | ❌ | ✅ | ✅ | | REPEATABLE READ (MySQL默认) | ❌ | ❌ | ✅ | | SERIALIZABLE | ❌ | ❌ | ❌ |6.3 MVCC 原理面试加分项隐藏字段DB_TRX_ID事务ID、DB_ROLL_PTR回滚指针Undo Log记录数据历史版本Read View决定事务可见哪些版本实现RC和RR隔离级别实现快照读七、Redis 篇7.1 Redis 五种基本数据类型| 类型 | 说明 | 使用场景 | |------|------|----------| | String | 字符串 | 缓存、计数器、分布式锁 | | Hash | 键值对集合 | 对象存储 | | List | 双向链表 | 消息队列、最新列表 | | Set | 无序集合 | 去重、共同好友 | | ZSet | 有序集合 | 排行榜、延迟队列 |7.2 缓存三大问题| 问题 | 描述 | 解决方案 | |------|------|----------| |缓存穿透| 请求数据库中不存在的数据直接打到 DB | 布隆过滤器、缓存空对象 | |缓存击穿| 热点 key 突然失效大量请求打到 DB | 互斥锁、逻辑过期 | |缓存雪崩| 大量 key 同时过期导致 DB 压垮 | 随机过期时间、多级缓存、限流降级 |7.3 Redis 过期策略与淘汰策略过期策略定期删除每隔 100ms 随机抽取部分 key 检查并删除惰性删除访问 key 时检查是否过期过期则删除淘汰策略8种noeviction不淘汰返回错误allkeys-lru所有 key 中 LRU 淘汰volatile-lru设置过期时间的 key 中 LRU 淘汰allkeys-lfu所有 key 中 LFU 淘汰Redis 4.0volatile-lfu设置过期时间的 key 中 LFU 淘汰allkeys-random随机淘汰volatile-random设置过期时间的随机淘汰volatile-ttlTTL 最小的优先淘汰八、面试高频手撕代码题8.1 单例模式双重检查锁public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }为什么要加 volatile防止指令重排序导致获取到未初始化完成的对象。8.2 生产者-消费者模型使用 BlockingQueuepublic class ProducerConsumer { public static void main(String[] args) { BlockingQueueInteger queue new ArrayBlockingQueue(10); // 生产者 new Thread(() - { for (int i 0; i 100; i) { try { queue.put(i); System.out.println(生产: i); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start(); // 消费者 new Thread(() - { while (true) { try { Integer val queue.take(); System.out.println(消费: val); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start(); } }九、面试技巧与建议STAR 法则描述项目经历时按 Situation背景、Task任务、Action行动、Result结果结构讲述深入原理不要只背概念要理解底层原理如 HashMap 为什么容量是 2 的幂次方、ConcurrentHashMap 如何计算 size主动引导回答问题时主动引出相关知识点引导面试官问自己擅长的方向代码能力多刷 LeetCode 热题 Hot 100面试手撕代码至少保持中等难度系统设计准备常见设计题秒杀系统、短链接、分布式 ID 生成器等十、推荐学习资源| 方向 | 推荐资源 | |------|----------| | Java 基础 | 《Java核心技术》 | | 并发编程 | 《Java并发编程的艺术》 | | JVM | 《深入理解Java虚拟机》周志明 | | Spring | 《Spring实战》、官方文档 | | MySQL | 《高性能MySQL》 | | Redis | 《Redis设计与实现》、《Redis开发与运维》 | | 系统设计 | 《大型网站技术架构》、《设计数据密集型应用》 |结语面试不只是知识的检验更是综合能力的比拼。扎实的基础 深入的理解 清晰的表达 面试成功的关键。希望这篇文章能帮你构建完整的 Java 面试知识体系祝你面试顺利Offer 拿到手软如果觉得本文对你有帮助欢迎点赞 、收藏 ⭐、评论 支持一下本文持续更新中关注我获取最新面试干货
[特殊字符] 2025年Java面试通关秘籍:高频核心知识点全解析(建议收藏)
2025年Java面试通关秘籍高频核心知识点全解析金三银四、金九银十面试季又来了你是否还在为Java面试发愁本文精心总结了Java面试中最高频、最核心的知识点覆盖Java基础、集合框架、多线程并发、JVM、Spring、MySQL、Redis等各大方向助你从容应对大厂面试一、Java基础篇1.1 面向对象三大特性| 特性 | 说明 | 面试要点 | |------|------|----------| |封装| 将数据和操作数据的方法绑定在一起对外隐藏实现细节 | 访问修饰符private、default、protected、public | |继承| 子类继承父类的属性和方法实现代码复用 | Java单继承、接口多实现、super关键字 | |多态| 同一个行为具有多个不同表现形式 | 重载编译时多态、重写运行时多态 |1.2 String 为什么是 final 的安全性防止被继承后修改字符串行为保证字符串常量池中的对象不可变效率不可变字符串可以被缓存、共享字符串常量池才得以实现线程安全不可变对象天然线程安全1.3 与 equals() 的区别| 对比维度 | | equals() | |---------|-----|----------| | 比较对象 | 基本类型比值引用类型比内存地址 | 默认比地址通常被重写为比值 | | 典型重写类 | - | String、Integer、Long 等包装类 |1.4 重载与重写的区别重载Overload同一个类中方法名相同参数列表不同与返回值无关重写Override子类对父类方法重新定义方法签名必须相同访问权限不能更严格二、集合框架篇2.1 HashMap 底层原理面试必问数据结构数组 链表 红黑树JDK 1.7数组 链表头插法JDK 1.8数组 链表 红黑树尾插法当链表长度 ≥ 8 且数组长度 ≥ 64 时转红黑树核心参数default_initial_capacity 16; // 默认初始容量 load_factor 0.75f; // 加载因子 TREEIFY_THRESHOLD 8; // 树化阈值put 流程计算 key 的 hashCode经过扰动函数后得到桶索引若该桶为空直接创建新节点若不为空判断 key 是否已存在存在则覆盖 value不存在则插入链表尾部 / 红黑树检查是否需要扩容size threshold扩容机制扩容为原容量的2 倍元素重新计算位置位置要么不变要么在原位置 原容量2.2 ConcurrentHashMap 如何保证线程安全重要| 版本 | 实现方式 | 锁粒度 | |------|----------|--------| | JDK 1.7 | Segment 数组 HashEntry 数组继承 ReentrantLock | 分段锁默认16个Segment | | JDK 1.8 | Node 数组 链表/红黑树 | CAS synchronized 锁桶节点 |JDK 1.8 核心机制空桶插入使用 CAS 无锁插入性能极高冲突插入使用 synchronized 锁住当前桶的头节点并发度理论上等于数组长度只要哈希不冲突不同线程可操作不同桶2.3 ArrayList 与 LinkedList 对比| 对比维度 | ArrayList | LinkedList | |---------|-----------|------------| | 底层结构 | 动态数组 | 双向链表 | | 随机访问 | O(1) | O(n) | | 插入/删除 | O(n)尾部O(1) | O(1)已知位置 | | 内存占用 | 连续内存较少 | 额外存储前后指针 | | 适用场景 | 频繁随机查询 | 频繁增删操作 |三、多线程与并发篇3.1 synchronized 原理JDK 1.6 之前重量级锁依赖 Mutex LockJDK 1.6 之后锁升级无锁 → 偏向锁 → 轻量级锁 → 重量级锁// 锁的四种状态 无锁 --------- 偏向锁 --------- 轻量级锁 --------- 重量级锁 标记对象 只有一个线程 少量竞争 大量竞争3.2 volatile 关键字可见性强制线程从主内存读取变量禁止线程工作内存缓存有序性禁止指令重排序内存屏障不保证原子性i 操作仍需加锁3.3 ThreadLocal每个线程持有自己的变量副本互不干扰底层Thread 类中有 ThreadLocalMap 属性内存泄漏风险使用完后务必调用remove()方法清除3.4 线程池核心参数7大参数| 参数 | 说明 | |------|------| | corePoolSize | 核心线程数 | | maximumPoolSize | 最大线程数 | | keepAliveTime | 空闲线程存活时间 | | unit | 时间单位 | | workQueue | 阻塞任务队列 | | threadFactory | 线程工厂 | | handler | 拒绝策略Abort、CallerRuns、Discard、DiscardOldest |线程池执行流程提交任务 → 核心线程满 → 队列满 → 最大线程满 → 拒绝策略四、JVM 篇4.1 JVM 内存区域划分| 区域 | 线程共享 | 作用 | |------|----------|------| | 堆Heap | ✅ 共享 | 存储对象实例GC 主要区域 | | 方法区Metaspace | ✅ 共享 | 存储类信息、常量、静态变量 | | 虚拟机栈 | ❌ 私有 | 存储局部变量表、操作数栈 | | 本地方法栈 | ❌ 私有 | 调用 native 方法 | | 程序计数器 | ❌ 私有 | 记录当前线程执行的字节码行号 |4.2 垃圾回收算法| 算法 | 原理 | 适用区域 | |------|------|----------| | 标记-清除 | 先标记垃圾再统一清除 | 老年代 | | 标记-复制 | 将内存分为两块只使用一块GC时将存活对象复制到另一块 | 新生代 | | 标记-整理 | 标记后所有存活对象向一端移动直接清理边界外内存 | 老年代 | | 分代收集 | 新生代用复制算法老年代用标记-整理或标记-清除 | 整堆 |4.3 常见 GC 调优参数-Xms4g # 初始堆大小 -Xmx4g # 最大堆大小 -Xmn2g # 新生代大小 -XX:MetaspaceSize256m -XX:UseG1GC # 使用 G1 垃圾回收器 -XX:PrintGCDetails # 打印 GC 日志五、Spring 框架篇5.1 Spring IoC 与 AOPIoC控制反转将对象的创建和管理交给 Spring 容器依赖注入方式构造器注入、Setter 注入、字段注入推荐构造器注入保证不可变性和可测试性AOP面向切面编程将日志、事务、权限等横切关注点从业务逻辑分离核心概念切面Aspect、连接点JoinPoint、通知Advice、切点Pointcut底层实现JDK 动态代理接口 CGLIB 代理类5.2 Spring 事务失效场景高频在同一个类中方法内部调用自调用代理不生效方法被final或static修饰抛出的异常类型与rollbackFor不匹配默认只回滚 RuntimeException数据库引擎不支持事务如 MyISAM多线程环境下事务不传递5.3 Spring Boot 自动配置原理SpringBootApplicationConfigurationEnableAutoConfigurationComponentScanEnableAutoConfiguration借助AutoConfigurationImportSelector加载META-INF/spring.factories中的自动配置类条件注解ConditionalOnClass、ConditionalOnMissingBean、ConditionalOnProperty等六、MySQL 篇6.1 索引相关索引类型| 类型 | 说明 | |------|------| | B 树索引 | InnoDB 默认支持聚簇索引 | | 哈希索引 | Memory 引擎等值查询快 | | 全文索引 | 用于大文本模糊匹配 | | 聚簇索引 | 叶子节点存储整行数据 | | 二级索引 | 叶子节点存储主键值需回表 |索引失效场景高频面试联合索引不满足最左前缀原则对索引列使用函数或运算使用 !、、or、not inlike 以 % 开头类型隐式转换例如字符串列不写引号6.2 MySQL 事务与隔离级别ACID 四大特性A原子性AtomicityC一致性ConsistencyI隔离性IsolationD持久性Durability四大隔离级别| 隔离级别 | 脏读 | 不可重复读 | 幻读 | |----------|:----:|:----------:|:----:| | READ UNCOMMITTED | ✅ | ✅ | ✅ | | READ COMMITTED | ❌ | ✅ | ✅ | | REPEATABLE READ (MySQL默认) | ❌ | ❌ | ✅ | | SERIALIZABLE | ❌ | ❌ | ❌ |6.3 MVCC 原理面试加分项隐藏字段DB_TRX_ID事务ID、DB_ROLL_PTR回滚指针Undo Log记录数据历史版本Read View决定事务可见哪些版本实现RC和RR隔离级别实现快照读七、Redis 篇7.1 Redis 五种基本数据类型| 类型 | 说明 | 使用场景 | |------|------|----------| | String | 字符串 | 缓存、计数器、分布式锁 | | Hash | 键值对集合 | 对象存储 | | List | 双向链表 | 消息队列、最新列表 | | Set | 无序集合 | 去重、共同好友 | | ZSet | 有序集合 | 排行榜、延迟队列 |7.2 缓存三大问题| 问题 | 描述 | 解决方案 | |------|------|----------| |缓存穿透| 请求数据库中不存在的数据直接打到 DB | 布隆过滤器、缓存空对象 | |缓存击穿| 热点 key 突然失效大量请求打到 DB | 互斥锁、逻辑过期 | |缓存雪崩| 大量 key 同时过期导致 DB 压垮 | 随机过期时间、多级缓存、限流降级 |7.3 Redis 过期策略与淘汰策略过期策略定期删除每隔 100ms 随机抽取部分 key 检查并删除惰性删除访问 key 时检查是否过期过期则删除淘汰策略8种noeviction不淘汰返回错误allkeys-lru所有 key 中 LRU 淘汰volatile-lru设置过期时间的 key 中 LRU 淘汰allkeys-lfu所有 key 中 LFU 淘汰Redis 4.0volatile-lfu设置过期时间的 key 中 LFU 淘汰allkeys-random随机淘汰volatile-random设置过期时间的随机淘汰volatile-ttlTTL 最小的优先淘汰八、面试高频手撕代码题8.1 单例模式双重检查锁public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }为什么要加 volatile防止指令重排序导致获取到未初始化完成的对象。8.2 生产者-消费者模型使用 BlockingQueuepublic class ProducerConsumer { public static void main(String[] args) { BlockingQueueInteger queue new ArrayBlockingQueue(10); // 生产者 new Thread(() - { for (int i 0; i 100; i) { try { queue.put(i); System.out.println(生产: i); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start(); // 消费者 new Thread(() - { while (true) { try { Integer val queue.take(); System.out.println(消费: val); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start(); } }九、面试技巧与建议STAR 法则描述项目经历时按 Situation背景、Task任务、Action行动、Result结果结构讲述深入原理不要只背概念要理解底层原理如 HashMap 为什么容量是 2 的幂次方、ConcurrentHashMap 如何计算 size主动引导回答问题时主动引出相关知识点引导面试官问自己擅长的方向代码能力多刷 LeetCode 热题 Hot 100面试手撕代码至少保持中等难度系统设计准备常见设计题秒杀系统、短链接、分布式 ID 生成器等十、推荐学习资源| 方向 | 推荐资源 | |------|----------| | Java 基础 | 《Java核心技术》 | | 并发编程 | 《Java并发编程的艺术》 | | JVM | 《深入理解Java虚拟机》周志明 | | Spring | 《Spring实战》、官方文档 | | MySQL | 《高性能MySQL》 | | Redis | 《Redis设计与实现》、《Redis开发与运维》 | | 系统设计 | 《大型网站技术架构》、《设计数据密集型应用》 |结语面试不只是知识的检验更是综合能力的比拼。扎实的基础 深入的理解 清晰的表达 面试成功的关键。希望这篇文章能帮你构建完整的 Java 面试知识体系祝你面试顺利Offer 拿到手软如果觉得本文对你有帮助欢迎点赞 、收藏 ⭐、评论 支持一下本文持续更新中关注我获取最新面试干货