我对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