摘要:HashMap 是基于哈希表的数据结构,用于存储键值对(key-value)。其核心是将键的哈希值映射到数组索引位置,通过数组 + 链表(在 Java 8 及之后是数组 + 链表 + 红黑树)来处理哈希冲突。
为大家准备了 2025年全新热门高频 Java 面试题。
适合准备求职、或者有跳槽想法的初/中/高级程序员。
也合适想要对自己技术栈查缺补漏、不断完善成长的人。
我们将面试题分成 Java基础&并发、MySQL、Redis、JVM……等多个分类。下面一起看看这些题目:
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。
我们整理了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 吧?
RabbitMQ 怎么实现延迟队列?RabbitMQ 中消息什么时候会进入死信交换机?RabbitMQ 中无法路由的消息会去到哪里?Kafka 为什么要抛弃 Zookeeper?Kafka 中 Zookeeper 的作用?说一下 Kafka 中关于事务消息的实现?说一下 RocketMQ 中关于事务消息的实现?RocketMQ 的事务消息有什么缺点?你还了解过别的事务消息实现吗?为什么需要消息队列?说一下消息队列的模型有哪些?如何处理重复消息?如何保证消息的有序性?如何处理消息堆积?如何保证消息不丢失?消息队列设计成推消息还是拉消息?推拉模式的优缺点?为什么 RocketMQ 不使用 Zookeeper 作为注册中心?说说 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 集群的实现原理是什么?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 是用来解决什么问题?简单说说 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?来源:程序员鱼皮