HashMap resize方法的理解(一)

对于oldTable中存储的为15、7、4、5、8、1,长度为8的一个数组中,存储位置如下

0

1

2

3

4

5

6

7

8

1

 

 

4

5

 

15

7

 

 

 

 

 

 

 

当扩容到一倍后,对于新的位置的选择通过e.hash & oldCap 确认其在新的数组中的位置,

如:

8:1000 与原来长度8:1000相与后,为1,则在新的数组中的位置,为原位置加上原数组长度即可。避免了重新计算数组位置。

对于7:111与原长度8:1000相与后,为0,表示其在新数组中的位置是不变的,仍在在7的位置上。

在求新数组的位置时,其仅是最高位上增加了1而已,与原数组长度最高位是一致的,忽略低位信息,可以直接判断出其在原数组中是否已经超过了本身的长度,形成了数据链。

最后在新的空间中存储如下:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

1

 

 

4

5

 

7

8

 

 

 

 

 

 

15

posted @ 2018-01-26 17:07  woniu4  阅读(1120)  评论(0编辑  收藏  举报