1. 数据结构
JDK 8 后,HashMap 使用数组 + 链表 + 红黑树。
2. hash 扰动
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }让高位参与运算,减少哈希冲突。
3. put 流程
计算 hash。
定位数组下标。
如果桶为空,直接插入。
如果冲突,遍历链表或红黑树。
链表长度达到 8 且容量达到 64,转为红黑树。
4. 扩容
默认容量 16,负载因子 0.75。扩容时容量翻倍,重新分配节点。
5. 线程安全
HashMap 线程不安全,多线程扩容可能导致数据丢失或死循环。并发场景使用ConcurrentHashMap。