- 一、源码
- 二、面试
- 0、考察范围
- 1、ConcurrentHashMap 是如何实现的? 1.7、1.8 实现有何不同?为什么这么做?
- 2、ConcurrentHashMap 的 Key 和 Value 都不能为 null,而 HashMap 却可以,设计的原因是什么?
- 追问1:TreeMap、Hashtable 等 Map 的 Key 和 Value 是否支持 null 呢?
- 三、参考
……
二、面试 0、考察范围这个问题可以考查三个点:你是否真的在一线写代码,因为只要是写代码就一定绕不开 。对这么常用的数据结构HashMap,你是只停留在会用 API 的层面,还是说
1、Java 的 HashMap 是如何实现的。按我的要求,候选人能够深入到内部算法实现,至少要把 HashMap 的内部数据结构实现和 get/put 算法给讲清楚。
2、能把装载因子(load factor)和再哈希(rehashing)給讲清楚。
3、延申:可以向 Java 集合框架方向延伸,也可以向 Java 多线程方向延伸,其中涉及的内容很多,例如 HashTable、ConcurrentHashMap,甚至 TreeMap、ConcurrentSkipList 和 ThreadLocal 等。HashMap 的基本原理并不难,但是延伸的内容如果没有实际动手实践过,你一般很难回答上来。
1、ConcurrentHashMap 是如何实现的? 1.7、1.8 实现有何不同?为什么这么做?JDK1.8之后ConcurrentHashMap就放弃了分段锁策略,而是直接使用CAS+Synchronized方式保证性能,这里的锁是指锁table的首个Node节点。在添加数据的时候,如果Node数组没有值的情况,则会使用CAS添加数据,CAS成功则添加成功,失败则进入锁代码块执行插入链表或红黑树或转红黑树操作。
2、ConcurrentHashMap 的 Key 和 Value 都不能为 null,而 HashMap 却可以,设计的原因是什么?
如果 Value 为 null 会增加二义性,即多线程情况下 map.get(key) 返回 null,我们无法区分 Value 原本就是 null 还是 Key 没有映射,Key 也是类似的原因。
而用于单线程状态的hashmap却可以用containKey(key) 去判断到底是否包含了这个null。
Hashtable 也是线程安全的,所以 Key 和 Value 不可以是 null。TreeMap 是线程不安全的,但是因为需要排序,需要进行 key 的 compareTo 方法,所以 Key 不能是 null,而 Value 可以是 null。
三、参考-
源码
1、JDK源码分析(12)之 ConcurrentHashMap 详解
2、ConcurrentHashMap扩容实现机制
3、ConcurrentHashMap详解
4、ConcurrentHashMap的使用
5、史上最详细的ConcurrentHashMap详解–源码分析 -
面试
1、面试:为了进阿里,死磕了ConcurrentHashMap源码和面试题(一)
2、《我们一起进大厂》系列-ConcurrentHashMap & Hashtable
3、并发容器–ConcurrentHashMap常见面试题
4、【Java自顶向下】ConcurrentHashMap面试题(2021最新版)
5、第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全? -
拓展
1、18 | 被面试官问住了怎么办?
2、05 | 考官面对面:我是如何面试程序员的?
3、12 | 多线程之锁优化(上):深入了解Synchronized同步锁的优化方法



