到目前为止,我知道在哈希映射中重新哈希后,所有条目都会与新的表长度一起重新映射。但我想知道当我碰撞时会发生什么。重新散列后,存储在同一个存储桶中的元素是否可以重新分配为单独的存储桶?
例如
Map<String, String> map = new HashMap<>(5);
map.put("a", "ape");
map.put("b", "bird");
map.put("c", "chicken");
想,他们有不同的哈希码,但"b"
和"c"
存储在内部哈希后同一个桶。
现在,我将插入一个第四条目到达负载因数因此重散列表:
map.put("d", "dynamite");
可以与碰撞的条目被存储在单独的桶或它们总是会在一起(在根据相反的顺序我读过的)?
我想这个标题的答案是否定的,因为我会得到相同的内部散列值
"b"
和
"c"
,但我不确定。
谢谢,只是为了简洁¿位掩码和国防部给出了相同的结果? – EMER
@EMER是的,假设我们使用了较短的散列,只有5位。对象A具有等于11000的散列码(二进制),对象B具有散列码10000.对于长度为8的数组,我们使用3位的位掩码,在两种情况下导致存储桶000。如果我们将数组大小增加到16,并使用4位作为掩码,则对象A将位于存储区1000中,但对象B将位于0000中:因此,它们将以不同的存储区结束,并且存储更大的数组。 –