Java 7和8中哈希映射的区别

14

当Java 7和Java 8的哈希表都使用常量复杂度算法时,它们之间有何区别?根据我的理解,哈希表通过哈希函数为对象生成哈希键,并在恒定时间内进行搜索。


1
@MDaniyal正确回答了,而没有使用描述两个或更多元素具有相同哈希情况的短语:“哈希碰撞”。如果您想更深入地了解哈希碰撞问题,请从这里开始:https://en.wikipedia.org/wiki/Hash_table#Collision_resolution - Jeutnarg
2个回答

22

在Java 7中,如果从哈希函数计算出的哈希值相同,则多个元素将通过线性搜索进行查找,因此它的时间复杂度为(n)。而在Java 8中,则采用二分搜索来执行该搜索,因此时间复杂度将变为log(n)。因此,哈希映射在所有时候都能以恒定的时间复杂度搜索对象的这一概念是错误的。


3
实际上存在一个门槛,它在JEP180中进行了描述,当单个桶/箱子具有超过TREEIFY_THRESHOLD = 8个条目时,它将被转换为树形结构。在Java 7中,由于冲突是线性搜索的,因此存在DOS保护:使用随机种子进行XOR运算,以使哈希值更加不可预测。但这个功能在Java 8中被删除。 - eckes
如果我们深入实现,它就是你所解释的@eckes的内容。 - MDaniyal

4

您可能会发现Java专家最新的问题newsletter非常有帮助。它深入探讨了多年来Java中的哈希,例如指出在使用Java8时最好确保您的映射键实现了Comparable。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接