hashmap扩容数据迁移过程
2025-09-24 17:20:23 0 举报
在Java中,HashMap扩容数据迁移是指当HashMap中的元素数量超过阈值时,它会自动扩容并进行数据迁移。核心内容包括以下几点: 1. **阈值定义**:HashMap内部定义了装载因子和阈值。装载因子默认为0.75,当元素数量(size)达到阈值(threshold)时,即`size >= threshold`,会触发扩容。 2. **扩容机制**:HashMap在扩容时会将容量翻倍,新容量是原来的2的幂次方,如原来的容量是`16`,则新容量是`32`。 3. **数据迁移**:在扩容过程中,HashMap会创建一个新的数组,然后将旧数组中的每个链表中的节点重新插入到新数组中。这一过程是通过`rehash`来完成的,即每个节点的键值对都会重新计算其哈希值,以确定在新数组中的位置。 4. **效率优化**:为了提高效率,在扩容时,HashMap并不是对所有元素重新计算哈希值,而是通过`oldHashSeed ^ ((h << 1) - (oldHashSeed & 0x7FFFFFFF))`的方式进行优化,避免了完整的重新计算。 描述以上核心内容,可以撰写为如下文档: **File Type**: Technical Document **Description**: The process of rescaling a HashMap in Java includes the assessment of the load factor, surpassing which triggers the threshold-based resizing. Typically resulting in doubling the capacity, and a subsequent rehash where the existing entries are efficiently migrated into the new array with minimal redetermination of hash values due to intelligent optimization techniques. This maintains map performance after elements exceed the initially set threshold, ensuring seamless access during dynamic expansion. The file, formatted as either `.txt` or `.docx` for either plain text readability or compatibility with word processors, encapsulates the technical essence of the hashmap expansion with a clear, concise description, laying bare the intricacies of this essential collection resizing operation in Java.
作者其他创作
大纲/内容
1
2
oldCap&hash = 8 高位,下标等于原来下标加上原来长度
4
当前table.length为64
... ...
hash
....
G
0
10
2.新的HashMap长度永远是旧的两倍
9
= n 或 0
12
单节点和链表迁移过程
7
1、n-1代表当当前数组的0-7的index下标2、hash的二进制低位和n-1的二进制对齐的那一部分开始,为最终的index
将一个红黑树拆分成了两条链表,因为原红黑树的长度为8,有4个元素hash&oldCap=0留在原位置;那么红黑树的长度不足8,则满足<6的条件,则会退化为链表
4.如果是红黑树结构,就调用红黑树方法进行迁移
5
1.for循环槽位,按顺序处理每个槽位数据,判断每个槽位结构
3.高位链表元素通过原索引加上原长度计算的下标和
新tab[ ]
3.如果是链表结构则遍历这条链表通过 n&hash 来判断链表上的元素位置在扩容前还是扩容后的hashmap,如果结果为0则下标不变,如果为n则当前下标加上n长度就是扩容后的新下标
3
D
C
n-1
A
11
= n - 1
6
E
n
13
&
1.hashmap扩容是创建新的map不是在原基础上操作
迁移流程
备注
F
8
这是put的第7个元素
2.如果是单节点就使用e.hash & (newCap - 1)对这个槽位重新计算下标
链表迁移
oldCap&hash = 0 低位,在新map下标不变
单节点迁移
原tab[]
B
H
15
14
for循环槽位,按顺序处理每个槽位数据,[j] 为当前数组位置索引
hash的低位代表数组下标,且不会超过n-1
如果都为1,那么结果为n;否则为0;
当前元素个数为6,扩容因子为0.75,扩容阈值为6,put下一个元素时发生扩容

收藏
0 条评论
下一页