如何是换汤不换药过程中一个HashMap或哈希表时,大小超过maxthreshold价值呢?
都对刚刚复制到桶的新数组?
编辑:
什么发生换汤不换药后在同一个桶中的元素(链表)? 我的意思是将他们留在同一个桶后,老调重弹?
如何是换汤不换药过程中一个HashMap或哈希表时,大小超过maxthreshold价值呢?
都对刚刚复制到桶的新数组?
编辑:
什么发生换汤不换药后在同一个桶中的元素(链表)? 我的意思是将他们留在同一个桶后,老调重弹?
在这个问题的最大阈值被称为负载系数。
最好是具有约0.75的负载因数。 负载因数定义为(M / N),其中n是哈希表的总大小,且m是可在底层数据结构的尺寸的增量之前,需要被插入项的优选数量。
老调重弹可以在两种情况下进行:
超出负载因数当本米'/ n比的增加
M'/ N比下降到非常低的值表示0.1
在这两种情况下m”为条目的当前数目。 此外,这两种情况的需求,本项的移位成一个更大或更小的哈希表。
在这个问题的背景下换汤不换药将哈希函数的条目将其移动到另一个哈希表的过程。 它可以使用其先前使用的哈希函数或完全使用新功能。
请注意:当发生碰撞时老调重弹也做。 (这是处理过碰撞的方式。)
要添加一些更多的背景和详细的讨论,请访问我的博客哈希基础
当在地图元件的数量达到最大阈值的散列映射的重散列完成。
通常负载因子值是0.75,默认初始容量值为16。一旦元件的数目达到或超过0.75倍的容量,然后重散列地图的发生。 在这种情况下,当元件的数目是12,则发生重散列。 (0.75 * 16 = 12)
当重散列发生新的散列函数,或可用于甚至相同的哈希函数,但在桶该值都存在可能会改变。 基本上,当重散列发生桶的数目被近似加倍,因此必须把在其值有新的指数的变化。
虽然老调重弹,每个区块的链接列表,以便得到逆转。 这是因为HashMap不能在尾部的新元素追加而是附加在头上的新元素。 因此,当重散列发生时,它读取每个元素,并将其插入在头部的新桶,然后不断在导致链表逆转新地图的头添加从旧地图下一个元素。
如果有多个线程处理相同的哈希地图可能导致无限循环。
详细解释说明如何无限循环在上述情况发生时可以在这里找到: http://mailinator.blogspot.hu/2009/06/beautiful-race-condition.html
如果插入到地图中的元素必须被排序WRT键然后TreeMap中都可以使用。 但HashMap的是,如果按键的顺序并不重要,更有效。
基本上同时创建散列映射,集合分配一个缺省容量(2 ^ 4即16)。 当要素在地图上和一定阶段之后添加了,当你接近你的最初定义的能力有换汤不换药保留性能的要求后阶段。
这里是收集(据说是好.75)在定义LoadFactor这规定了时间和空间的良好指标。
Java规范表明,良好的负载系数值为0.75
因此,假设你要存储在哈希的10个元素则考虑好Loadfactor .75最大需求=将增加集合中的7种元素后出现换汤不换药。 在情况下,如果您的要求,在这种情况下,也不会加入7则再次提出将永远不会发生。
如果真的有大量没有元素将被存储在HashMap中的那么这是一件好事,以创建具有足够容量的HashMap; 这是不是让它进行自动重散列更有效。
RACE条件:在这样做中存储的用于给定存储桶的链接列表的重散列内部元件。 他们得到的顺序颠倒。 假设有两个线程遇到同一时间比赛条件,那么还有第二therad的机会,可以在无限循环中去,同时由于序遍历已经改变。