为大家准备了 2025年全新热门高频 Java 面试题。
适合准备求职、或者有跳槽想法的初/中/高级程序员。
也合适想要对自己技术栈查缺补漏、不断完善成长的人。
我们将面试题分成 Java基础&并发、MySQL、Redis、JVM......等多个分类。下面一起看看这些题目:
Java 基础&并发(33 题)
1,说说 Java 中 HashMap 的原理?
HashMap
是基于哈希表的数据结构,用于存储键值对 (key-value
)。其核心是将键的哈希值映射到数组索引位置,通过数组 + 链表 (在 Java 8 及之后是数组 + 链表 + 红黑树)来处理哈希冲突。
HashMap
使用键的 hashCode()
方法计算哈希值,并通过 indexFor
方法(JDK 1.7 及之后版本移除了这个方法,直接使用 (n - 1) & hash
)确定元素在数组中的存储位置。哈希值是经过一定扰动处理的,防止哈希值分布不均匀,从而减少冲突。
HashMap
的默认初始容量为 16,负载因子为 0.75。也就是说,当存储的元素数量超过 16 × 0.75 = 12 个时,HashMap
会触发扩容操作,容量x2并重新分配元素位置。这种扩容是比较耗时的操作,频繁扩容会影响性能。
2,Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别?
JDK 1.7 ConcurrentHashMap
采用的是分段锁 ,即每个 Segment
是独立的,可以并发访问不同的 Segment
,默认是 16 个 Segment
,所以最多有 16 个线程可以并发执行。
而 JDK 1.8 移除了 Segment
,锁的粒度变得更加细化,锁只在链表或红黑树的节点级别 上进行。通过 CAS 进行插入操作,只有在更新链表或红黑树时才使用 synchronized
,并且只锁住链表或树的头节点,进一步减少了锁的竞争,并发度大大增加。
并且 JDK 1.7 ConcurrentHashMap
只使用了数组 + 链表 的结构,而 JDK 1.8 和 HashMap
一样引入了红黑树。
除此之外,还有扩容的区别以及 size
方法的计算也不一样。
3,为什么 JDK 1.8 对 HashMap 进行了红黑树的改动?
在 JDK 1.8 之前,HashMap
使用链表来解决哈希冲突。当哈希冲突较多时,链表中的元素增多,查找、插入和删除的时间复杂度从 O(1) 退化为 O(n)。
因此在 JDK 1.8 引入红黑树,将链表长度超过一定阈值(默认 8)时的链表转换为红黑树,避免性能急剧下降。当链表长度降到 6 以下时,红黑树会重新退化为链表,保持简单高效。
红黑树是一种平衡二叉搜索树,插入、删除、查找操作的时间复杂度为 O(log n),在元素多的情况下远优于链表的 O(n)。
4,JDK 1.8 对 HashMap 除了红黑树还进行了哪些改动?
- 改进了哈希函数的计算:JDK 1.8 中优化了哈希函数,使得哈希值的分布更加均匀,减少了哈希冲突的发生。通过在生成哈希值时使用"扰动函数",确保哈希值的高低位都能参与到桶的选择中。
- 扩容机制优化:JDK 1.8 改进了扩容时的元素迁移机制。在扩容过程中不再对每个元素重新计算哈希值,而是根据原数组长度的高位来判断元素是留在原位置,还是迁移到新数组中的新位置。这一改动减少了不必要的计算,提升了扩容效率。
- 头插法变为尾插法:头插法的好处就是插入的时候不需要遍历链表,直接替换成头结点,但是缺点是扩容的时候会逆序,而逆序在多线程操作下可能会出现环,产生死循环,于是改为尾插法。
5,Java 中有哪些集合类?请简单介绍
Java 中的集合类主要分为两大类:Collection 接口和 Map 接口。前者是存储对象的集合类,后者存储的是键值对(key-value)。
Collection 接口下又分为 List、Set 和 Queue 接口。每个接口有其具体实现类。以下是主要的集合类:
List 接口:
- ArrayList:基于动态数组,查询速度快,插入、删除慢。
- LinkedList:基于双向链表,插入、删除快,查询速度慢。
- Vector:线程安全的动态数组,类似于 ArrayList,但开销较大。
Set 接口:
- HashSet:基于哈希表,元素无序,不允许重复。
- LinkedHashSet:基于链表和哈希表,维护插入顺序,不允许重复。
- TreeSet:基于红黑树,元素有序,不允许重复。
所以网上有些说 Set 是无序集合非常不准确,因为需要看具体的实现类。
Queue 接口:
- PriorityQueue:基于优先级堆,元素按照自然顺序或指定比较器排序。
- LinkedList:可以作为队列使用,支持 FIFO(先进先出)操作。
Map 接口:
存储的是键值对,也就是给对象(value)设置了一个 key,这样通过 key 可以找到那个 value。
- HashMap:基于哈希表,键值对无序,不允许键重复。
- LinkedHashMap:基于链表和哈希表,维护插入顺序,不允许键重复。
- TreeMap:基于红黑树,键值对有序,不允许键重复。
- Hashtable:线程安全的哈希表,不允许键或值为 null。
- ConcurrentHashMap:线程安全的哈希表,适合高并发环境,不允许键或值为 null。
我们整理了2025年全新 java 高频热门面试题,包括:Java、 MySQL、Redis、Spring、SpringBoot、SpringCloud、计算机网络、操作系统、消息队列、Netty、后端场景题、线上问题排查、后端系统设计题 等等内容。
篇幅限制,后续全套高频面试题及详细题解 可以【点击此处获取】。
6,为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)?
7,为什么 Java 中 HashMap 的默认负载因子是 0.75?
8,Java 中 HashMap 的扩容机制是怎样的?
9,为什么 HashMap 在 Java 中扩容时采用 2 的 n 次方倍?
10,数组和链表在 Java 中的区别是什么?
11,Java 线程池核心线程数在运行过程中能修改吗?如何修改?
12,Java 中如何创建多线程?
13,Java 中的 final 关键字是否能保证变量的可见性?
14,什么是 Java 中的原子性、可见性和有序性?
15,什么是 Java 的 CAS(Compare-And-Swap)操作?
16,为什么 Java 中的 ThreadLocal 对 key 的引用为弱引用?
17,编译执行与解释执行的区别是什么?JVM 使用哪种方式?
18,Java 中什么情况会导致死锁?如何避免?
19,你了解 Java 线程池的原理吗?
20,Java 线程池有哪些拒绝策略?
21,如何合理地设置 Java 线程池的线程数?
22,你使用过哪些 Java 并发工具类?
23,Synchronized 和 ReentrantLock 有什么区别?
24,Java 的 synchronized 是怎么实现的?
25,如何优化 Java 中的锁的使用?
26,Java 中常见的垃圾收集器有哪些?
27,Java 中有哪些垃圾回收算法?
28,什么是 Java 内存模型(JMM)?
29,线程和进程有什么区别?
30,Java 中 volatile 关键字的作用是什么?
31,什么是 Java 中的 ABA 问题?
32,线程的生命周期在 Java 中是如何定义的?
33,说说 AQS 吧?
JVM 相关(7 题)
- JVM 由哪些部分组成?
- JVM 垃圾回收调优的主要目标是什么?
- 如何对 Java 的垃圾回收进行调优?
- 常用的 JVM 配置参数有哪些?
- JVM 的内存区域是如何划分的?
- JVM 有哪几种情况会产生 OOM(内存溢出)?
- 怎么分析 JVM 当前的内存占用情况?OOM 后怎么分析?
MySQL(32 题)
- MySQL 索引的最左前缀匹配原则是什么?
- 数据库的脏读、不可重复读和幻读分别是什么?
- MySQL 的存储引擎有哪些?它们之间有什么区别?
- MySQL 的覆盖索引是什么?
- MySQL 的索引类型有哪些?
- MySQL 的索引下推是什么?
- MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?
- MySQL 中的回表是什么?
- MySQL 中使用索引一定有效吗?如何排查索引效果?
- MySQL 中的索引数量是否越多越好?为什么?
- 请详细描述 MySQL 的 B+ 树中查询数据的全过程
- 为什么 MySQL 选择使用 B+ 树作为索引结构?
- MySQL 三层 B+ 树能存多少数据?
- 详细描述一条 SQL 语句在 MySQL 中的执行过程。
- MySQL 是如何实现事务的?
- MySQL 事务的二阶段提交是什么?
- MySQL 中长事务可能会导致哪些问题?
- MySQL 中的 MVCC 是什么?
- MySQL 中的事务隔离级别有哪些?
- MySQL 默认的事务隔离级别是什么?为什么选择这个级别?
- MySQL 中有哪些锁类型?
- MySQL 的乐观锁和悲观锁是什么?
- MySQL 中如果发生死锁应该如何解决?
- MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
- MySQL 中如何进行 SQL 调优?
- 如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
- MySQL 中如何解决深度分页的问题?
- 什么是 MySQL 的主从同步机制?它是如何实现的?
- 如何处理 MySQL 的主从同步延迟?
- MySQL 中如果我 select * from 一个有 1000 万行的表,内存会飙升么?
- 在 MySQL 中建索引时需要注意哪些事项?
- 在什么情况下,不推荐为数据库建立索引?
消息队列(16 题)
- RabbitMQ 怎么实现延迟队列?
- RabbitMQ 中消息什么时候会进入死信交换机?
- RabbitMQ 中无法路由的消息会去到哪里?
- Kafka 为什么要抛弃 Zookeeper?
- Kafka 中 Zookeeper 的作用?
- 说一下 Kafka 中关于事务消息的实现?
- 说一下 RocketMQ 中关于事务消息的实现?
- RocketMQ 的事务消息有什么缺点?你还了解过别的事务消息实现吗?
- 为什么需要消息队列?
- 说一下消息队列的模型有哪些?
- 如何处理重复消息?
- 如何保证消息的有序性?
- 如何处理消息堆积?
- 如何保证消息不丢失?
- 消息队列设计成推消息还是拉消息?推拉模式的优缺点?
- 为什么 RocketMQ 不使用 Zookeeper 作为注册中心?
设计模式(11 题)
- 谈谈你了解的最常见的几种设计模式,说说他们的应用场景
- 什么是策略模式?一般用在什么场景?
- 什么是责任链模式?一般用在什么场景?
- 什么是模板方法模式?一般用在什么场景?
- 什么是观察者模式?一般用在什么场景?
- 什么是代理模式?一般用在什么场景?
- 请描述简单工厂模式的工作原理。
- 工厂模式和抽象工厂模式有什么区别?
- 什么是设计模式?请简述其作用。
- 单例模式有哪几种实现?如何保证线程安全?
- Netty 采用了哪些设计模式?
Spring 框架(19 题)
- 说说 Spring 启动过程?
- 你了解的 Spring 都用到哪些设计模式?
- Spring 有哪几种事务传播行为?
- 说说 Springboot 的启动流程?
- SpringBoot 是如何实现自动配置的?
- 如何理解 Spring Boot 中的 starter?
- Spring Boot 是如何通过 main 方法启动 web 项目的?
- Spring Boot 的核心特性有哪些?
- 什么是 Spring Boot?
- 什么是 Spring IOC?
- Spring AOP 默认用的是什么动态代理,两者的区别?
- 什么是 AOP?
- 看过源码吗?说下 Spring 由哪些重要的模块组成?
- 什么是循环依赖(常问)?
- Spring 如何解决循环依赖?
- 为什么 Spring 循环依赖需要三级缓存,二级不够吗?
- 说下 Spring Bean 的生命周期?
- Spring MVC 具体的工作原理?
- Spring 中的 DI 是什么?
Redis(31 题)
- Redis 集群的实现原理是什么?
- Redis 集群会出现脑裂问题吗?
- Redis 中如何实现分布式锁?
- Redis 实现分布式锁时可能遇到的问题有哪些?
- 说说 Redisson 分布式锁的原理?
- 如何使用 Redis 快速实现排行榜?
- Redis 中如何保证缓存与数据库的数据一致性?
- Redis 为什么这么快?
- 如何使用 Redis 快速实现布隆过滤器?
- 为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
- 你在项目中使用的 Redis 客户端是什么?
- Redis 中常见的数据类型有哪些?
- Redis 中跳表的实现原理是什么?
- Redis 性能瓶颈时如何处理?
- Redis 的 hash 是什么?
- Redis 和 Memcached 有哪些区别?
- Redis 支持事务吗?如何实现?
- Redis 数据过期后的删除策略是什么?
- Redis 中有哪些内存淘汰策略?
- Redis 的 Lua 脚本功能是什么?如何使用?
- Redis 的 Pipeline 功能是什么?
- Redis 通常应用于哪些场景?
- Redis 中的 Big Key 问题是什么?如何解决?
- 如何解决 Redis 中的热点 key 问题?
- Redis 的持久化机制有哪些?
- Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么?
- 线上发现 Redis 机器爆了,如何优化?
- Redis 在生成 RDB 文件时如何处理请求?
- Redis 的哨兵机制是什么?
- Redis 主从复制的实现原理是什么?
- 如果发现 Redis 内存溢出了?你会怎么做?
计算机网络相关(19 题)
- 说说 TCP 的三次握手?
- 说说 TCP 的四次挥手?
- 为什么 TCP 挥手需要有 TIME_WAIT 状态?
- TCP 超时重传机制是为了解决什么问题?
- TCP 滑动窗口的作用是什么?
- TCP/IP 四层模型是什么?
- OSI 七层模型是什么?
- 从网络角度来看,用户从输入网址到网页显示,期间发生了什么?
- 什么是物理地址,什么是逻辑地址?
- 到底什么是 TCP 连接?
- HTTP 1.0 和 2.0 有什么区别?
- HTTP 2.0 和 3.0 有什么区别?
- HTTP 和 HTTPS 有什么区别?
- HTTP 与 RPC 之间的区别?
- TCP 和 UDP 有什么区别?
- TCP 的粘包和拆包能说说吗?
- Cookie、Session、Token 之间有什么区别?
- 线上 CPU 飙高如何排查?
- TCP 是用来解决什么问题?
其他框架(17 题)
- 简单说说 Netty 的零拷贝机制?
- Netty 是如何解决粘包和拆包问题的?
- Netty 如何解决 JDK NIO 中的空轮询 Bug?
- 介绍一下 Reactor 线程模型?
- 说说你知道的几种 I/O 模型
- Select、Poll、Epoll 之间有什么区别?
- 说一下 Netty 的应用场景?
- 为什么不选择使用原生的 NIO 而选择使用 Netty 呢?
- Netty 性能为什么这么高?
- 简述 MyBatis 的插件运行原理,以及如何编写一个插件?
- 说说 MyBatis 的缓存机制?
- MyBatis 中 #{} 和 ${} 的区别是什么?
- MyBatis 与 Hibernate 有哪些不同?
- 什么是 MyBatis-Plus?它有什么作用?
- Dubbo 和 Spring Cloud Gateway 有什么区别?
- 什么是 API 网关?它有什么作用?
- 什么是 Seata?
分布式相关(13 题)
- 什么情况下需要使用分布式事务,有哪些方案?
- 如何设计一个秒杀功能?
- 让你设计一个分布式 ID 发号器,怎么设计?
- 让你设计一个短链系统,怎么设计?
- 分布式锁一般都怎样实现?
- 如何设计一个点赞系统?
- 让你设计一个 RPC 框架,怎么设计?
- 什么是限流?限流算法有哪些?
- 负载均衡算法有哪些?
- 分布式和微服务有什么区别?
- 什么是服务熔断?
- 什么是服务降级?
- 什么是服务雪崩?