Java HashMap 源码深度解析
一、基本原理
HashMap 继承自 AbstractMap 类,实现了 Map 接口。它基于哈希表(Hash Table)实现,允许 null 键和 null 值。在 JDK 1.8 中,HashMap 采用'数组 + 链表 + 红黑树'的结构,旨在平衡查询效率与空间占用。
1.1 存储节点结构
HashMap 的存储节点主要涉及以下四类:
- Entry: JDK 1.7 中的节点结构。
- Node: JDK 1.8 中主要的节点结构,包含 key、value、hash、next。
- TreeNode: 当链表长度超过阈值时转换成的红黑树节点。
- LinkedHashMapEntry: LinkedHashMap 特有的节点。
当哈希冲突较少时,表现为数组;当冲突较多形成链表时,若链表长度大于 8 且数组长度大于等于 64,则转换为红黑树以提升查询效率至 O(logN)。
1.2 关键常量与变量
// 默认初始容量:16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
// 最大容量:2^30
static final int MAXIMUM_CAPACITY = 1 << 30;
// 默认加载因子:0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// 链表转红黑树的阈值
static final int TREEIFY_THRESHOLD = 8;
// 红黑树退化为链表的阈值
static final int UNTREEIFY_THRESHOLD = 6;
// 最小树化容量阈值
;
size;
threshold;
loadFactor;


