当哈希表或散列表的大小超过最大阈值时,如何进行重新散列过程?
是否所有键值对都会被复制到一个新的桶数组中?
编辑:
在重新散列后,同一桶中的元素(在链表中)会发生什么?我的意思是它们是否会留在同一桶中?
当哈希表或散列表的大小超过最大阈值时,如何进行重新散列过程?
是否所有键值对都会被复制到一个新的桶数组中?
编辑:
在重新散列后,同一桶中的元素(在链表中)会发生什么?我的意思是它们是否会留在同一桶中?
问题中的最大阈值称为负载因子。
建议将负载因子设置为约0.75。负载因子定义为(m/n),其中n是哈希表的总大小,m是在需要增加基础数据结构的大小之前可以插入的首选条目数。
重新散列可以在两种情况下进行:
当当前m'/n比率超过负载因子时
M'/n比率下降到非常低的值,例如0.1
在这两种情况下,m'是当前条目数。此外,在两种情况下都要求将现有条目移动到更大或更小的哈希表中。
在问题的上下文中,重新散列是将条目应用于哈希函数以将它们移动到另一个哈希表的过程。可以使用先前使用过的哈希函数或者使用全新的函数。
请注意:当发生冲突时也会执行重新散列。(这是处理冲突的一种方式。)
要了解更多内容和详细讨论,请访问我的博客哈希基础知识
创建哈希映射时,集合会为其分配默认容量(即2 ^ 4,即16)。在向地图中添加元素后,在接近初始定义的容量的某个阶段之后,需要进行重新哈希以保持性能。
集合定义了负载因子(称为.75),这指定了时间和空间的良好索引。
Java规范建议使用0.75作为良好的负载因子值。
因此,假设您最多需要存储10个元素,则考虑到良好的负载因子0.75 = 在集合中添加7个元素后将进行重新哈希。如果您的要求在这种情况下不超过7,则不会发生重新哈希。
如果要存储的元素数量非常大,则最好使用足够容量创建HashMap;这比让它执行自动重新哈希更有效率。
竞争条件:在进行重新哈希时,存储在给定桶中的内部元素会以相反的顺序存储。假设两个线程在同一时间遇到竞争条件,则第二个线程在遍历时可能会进入无限循环,因为顺序已更改。