为什么Java 8中的哈希映射使用二叉树而不是链表?

我最近才知道在Java 8哈希映射中使用二叉树而不是链表,并使用哈希码作为分支因子.我知道在高冲突的情况下,查找从O(n)减少到O(log n)通过使用二叉树.我的问题是它真正做了什么好处,因为摊销的时间复杂度仍然是O(1)并且如果你强制通过为所有键提供相同的哈希码来存储同一个桶中的所有条目可以看到一个显着的时间差异,但在他们正确的思想中没有人会这样做.

二进制树比单链表使用更多空间,因为它存储左右节点.当除了一些虚假测试用例之外,当时间复杂度完全没有改善时,为什么增加空间复杂度.

最佳答案
这主要是与安全相关的变化.虽然在正常情况下很少有可能发生很多冲突,如果散列密钥来自不受信任的来源(例如从客户端收到的HTTP头名称),那么可能并且不是很难专门制作输入,因此生成的密钥将具有相同的哈希码.现在,如果您执行许多查找,您可能会遇到拒绝服务.似乎在野外有相当多的代码容易受到这种攻击,因此决定在Java端解决这个问题.

有关更多信息,请参阅JEP-180.

转载注明原文:为什么Java 8中的哈希映射使用二叉树而不是链表? - 代码日志