← 学习中心

Java 集合:HashMap 底层原理与并发安全

深入 HashMap 的数据结构、扩容机制、哈希优化,以及并发场景下的线程安全问题与 ConcurrentHashMap 的演进。

本节你将能

说清 HashMap 的底层结构、扩容与哈希规则,并解释为什么 HashMap 线程不安全、并发场景该用什么。

核心要点

  • JDK 1.8 结构:数组 + 链表 + 红黑树;链表长度达 8 转树、6 退化为链表。
  • 容量取 2 的幂:用 (n-1)&hash 定位桶,扩容时只需看一位即可 rehash。
  • 负载因子 0.75 是时间与空间的折中,达到阈值扩容为 2 倍。
  • HashMap 非线程安全:1.7 头插法并发成环,1.8 仍有数据覆盖;并发请用 ConcurrentHashMap。
  • ConcurrentHashMap 1.8 用 CAS + synchronized(锁桶头),粒度远细于 1.7 分段锁。

面试连招

常被追问:为什么红黑树阈值是 8?为什么用尾插法?ConcurrentHashMap 的 size() 如何统计?

常见坑

用可变对象作 key 会导致后续 get 不到原值;Integer 缓存范围 -128~127,超出范围 == 为 false。

Java 集合:HashMap 底层原理与并发安全 | 必学必会