我对Java的HashMap
类有一些疑问。我的理解是:
transient Entry[] table;
将根据hashCode()的值来保存数据。我需要知道什么时候会初始化此数组。这个数组的长度是基于我们在HashMap
初始化期间定义的容量还是如果在调用构造函数时未定义,则默认容量为16?
HashCode()如何缩放到数组索引?例如,如果hashCode()有一个很大的值,它如何缩放到类似于10、20的数组索引上?
我已经阅读过当达到阈值时会发生rehashing的内容。例如,在默认情况下,当16是容量且0.75是负载因子时,那么阈值为16 * 0.75 = 12
。一旦添加了12个项目,就会发生rehashing并增加容量。这是否意味着table
数组大小会增加?
table
数组的类型是HashMap
的内部类型-Node
,它具有对可能的“下一个”节点的引用。因此,以这种方式,固定大小的table
可以拥有无限数量的条目。当键值对的数量(即HashMap
中的size
字段)超过threshold
值(即table
数组大小乘以loadFactor
)时,通常会触发调整大小。 - entpnerdtable
(最后一个索引是3,即二进制中的11),索引哈希值为14(1110)。在这种情况下,该值将存储在索引3&14 == 11&1110 == 0011&1110 == 10 == 2
处。稍后,table
的大小调整为8(最后一个索引为7,或二进制中的111)。因此,在调整大小时,14将被索引到7&14 == 111&1110 == 0111&1110 == 110 == 6
处。因此,当大小改变时,相同元素在table
数组中的索引从2更改为6。 - entpnerdget()
方法的疑虑,节点并不是“相互嵌套”索引的。相反,您可以将table
视为在每个索引处具有节点链表,即使类型为Node[]
。这是因为Node
实例包含对next
节点的引用。有关详细信息,请参见Node
类的实现(http://tinyurl.com/hhqcxl8)。请注意,这被称为链接。有关哈希表链接的描述,请查看维基百科上的文章(http://tinyurl.com/zn8gl3c)。 - entpnerd