一、Map 体系全景图
Java 集合框架中的 Map 接口是键值对存储的核心抽象,其主流实现类呈现差异化特性:
实现类、数据结构、顺序特性、线程安全、时间复杂度
HashMap 数组+链表+红黑树 无序 否 O(1)~O(log n)
LinkedHashMap 双向链表维护顺序 插入/访问顺序 否 O(1)
TreeMap 红黑树 键自然/定制排序 否 O(log n)
Hashtable 数组+链表 无序 是 O(1)
ConcurrentHashMap 分段锁+CAS 无序 是 O(1)~O(log n)
二、HashMap 核心数据结构剖析
2.1 动态存储结构
// JDK 1.8+ 的节点定义
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next; // 链表指针
}
// 树化阈值
static final int TREEIFY_THRESHOLD = 8;
static final int MIN_TREEIFY_CAPACITY = 64;
存储结构演进策略:
初始使用链表处理哈希冲突
当链表长度 ≥8 且桶数组长度 ≥64 时树化
红黑树节点数 ≤6 时退化为链表
2.2 哈希扰动函数
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
通过高位异或运算增强哈希分散性,降低碰撞概率。
2.3 扩容机制
final Node