Java 当HasMap增大其大小时,它的值索引会发生什么变化?

Java 当HasMap增大其大小时,它的值索引会发生什么变化?,java,dictionary,hash,hashmap,hashtable,Java,Dictionary,Hash,Hashmap,Hashtable,我理解,当我们声明如下地图时: Map <String, Integer> map = new HashMap (); Map-Map=newhashmap(); 默认加载因子为0.75,其大小为16,当贴图的存储桶数超过12个元素时,大小将更改为32 但是,当使用put函数时,映射选择对象将放置的存储桶索引的方式由hascode%n定义,但是当映射大小超过负载系数时会发生什么?n不再具有相同的值,因此,如果在应用hascode%n时,结果索引将与以前不同,您如何找到以前设置的条

我理解,当我们声明如下地图时:

Map <String, Integer> map = new HashMap ();
Map-Map=newhashmap();
默认加载因子为0.75,其大小为16,当贴图的存储桶数超过12个元素时,大小将更改为32

但是,当使用put函数时,映射选择对象将放置的存储桶索引的方式由
hascode%n
定义,但是当映射大小超过负载系数时会发生什么?n不再具有相同的值,因此,如果在应用
hascode%n
时,结果索引将与以前不同,您如何找到以前设置的条目

我的最后一个问题是:

在我们增加大小之后,桶的索引怎么可能是相同的

HashMap
的默认初始容量为16,负载系数为0.75f(即当前映射大小的75%)。负载系数表示
HashMap
容量应加倍的级别

例如容量和负载系数的乘积为
16*0.75=12
。这表示将第12个键值对存储到
HashMap
后,其容量变为32

进一步的流程说明

当 贴图达到最大阈值

通常,荷载系数值为0.75,默认初始承载力 值为16。一旦元素数量达到或超过0.75倍 容量,然后重新灰化地图。在这种情况下,当 元素数为12,则发生重新灰化。(0.75*16=12)

当发生重新哈希时,会出现一个新的哈希函数,甚至是相同的哈希函数 可以使用函数,但不能使用存在值的存储桶 可能会改变。基本上,当重新灰化发生时,桶的数量 大约是原来的两倍,因此新的指数 必须进行更改

重新灰化时,每个bucket的链接列表在 秩序。发生这种情况是因为HashMap不会在 相反,尾部在头部附加新元素。那么什么时候 重新灰化发生时,它读取每个元素并将其插入新的 桶的头部,然后继续添加下一个元素从旧的 地图位于新地图的头部,导致链接列表的反转

如果有多个线程处理同一个哈希映射,那么 导致无限循环

详细说明无限循环是如何在上述过程中发生的 该案例可在此处找到:

如果地图中插入的元素必须按键排序,则 可以使用TreeMap。但如果顺序为 钥匙不重要

内部数据 重建建筑物。从文件中:

当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新格式化(即,重建内部数据结构),以便哈希表的存储桶数大约是存储桶数的两倍


不要保持秩序。看看用什么来代替。

我想你要问的是“在我们增加了桶的大小之后,桶的索引怎么可能是相同的?”

答案很简单,它不能
HashMap
必须在其展开时对所有元素执行重新灰化

请参见以下方法:

/**
 * Transfers all entries from current table to newTable.
 */
void transfer(Entry[] newTable, boolean rehash) {
它由
resize
调用。JavaDoc说

将此映射的内容重新灰化到一个新数组中,该数组具有更大的 容量。当关键点的数量增加时,将自动调用此方法 在这幅图中,它达到了它的阈值

重点矿山

另见:


Map
不维护索引。顺便说一句,
hashcode()
是该项的属性,而不是基于该项可能存在的任何集合……他没有说它们存在。他说的是桶的指数。桶是一个数组,因此有一个索引。这如何回答他的问题?