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()
是该项的属性,而不是基于该项可能存在的任何集合……他没有说它们存在。他说的是桶的指数。桶是一个数组,因此有一个索引。这如何回答他的问题?