HashMap扩容:两倍扩容,底层为数组,当数组满了之后,会自动扩容。
扩容:扩大数组长度,对原数组进行rehash操作,把原数组copy到新数组中
问题:假设16数组中[<>]同一个位置存放了多对key-value,当扩容为32位时,其中某对或多对key-value发生了位置的变动。
扩容后,要进行rehash重新将hash值与n-1进行与运算。如下
数组长度=16
n-1 0000 0000 0000 0000 0000 0000 0000 1111
hash1 1111 1111 1111 1111 0000 1111 0000 0101
&结果 0000 0000 0000 0000 0000 0000 0000 0101
&结果=5(index为5的位置)
n-1 0000 0000 0000 0000 0000 0000 0000 1111
hash2 1111 1111 1111 1111 0000 1111 0001 0101
&结果 0000 0000 0000 0000 0000 0000 0000 0101
&结果=5(index为5的位置)
在数组长度为16的时候,两个hash值的位置是一样的,用链表来进行处理,出现一个hash冲突的问题
如果数组长度扩容之后为32,重新对每个hash值进行寻址,也就是用每个hash值跟新数组的length-1进行与操作
数组长度=32
n-1 0000 0000 0000 0000 0000 0000 0001 1111
hash1 1111

HashMap在数组满时会两倍扩容,扩容过程中通过rehash将原数组元素迁移到新数组。在16到32的扩容例子中,由于新n-1的高位多一个1,导致某些元素位置改变。rehash通过位运算提高效率,避免使用取模操作。扩容时,如果桶单元是链表或红黑树,会根据与旧容量的运算决定在新桶的位置。
最低0.47元/天 解锁文章
1014

被折叠的 条评论
为什么被折叠?



