目录
当我们往HashMap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。
如果这个元素所在的位置上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的元素放在链头,而先前加入的放在链尾。
如果现在size已经超过了threshold,那么就要进行resize操作,新建一个更大尺寸的hash表,然后把数据从老的Hash表中迁移到新的Hash表中。
多线程的话如果线程2rehash,可能会出现环形指向
一、正常的ReHash的过程(单线程)
假设了我们的hash算法就是简单的用key mod 一下表的大小(也就是数组的长度)。
最上面的是old hash 表,其中的Hash表的size=2, 所以key = 3, 7, 5
,在mod 2以后都冲突在table[1]这里了。接下来的三个步骤是Hash表 resize成4,然后所有的<key,value>
重新rehash的过程。
二、假如我们有两个线程
线程二执行:
线程一执行
三、环形连接出现
注意:此时的key(7).next
已经指向了key(3)
, 环形链表就这样出现了。