use*_*360 12 java theory hashmap java-8
我最近才知道在Java 8哈希映射中使用二叉树而不是链表,并使用哈希代码作为分支因子.我知道在高冲突的情况下,查找从O(n)减少到O(log n)通过使用二叉树.我的问题是它真正做了什么好处,因为摊销的时间复杂度仍然是O(1)并且如果你强制通过为所有键提供相同的哈希码来存储同一桶中的所有条目可以看到一个显着的时间差异,但没有一个人在他们正确的思想中会这样做.
二进制树比单链表使用更多空间,因为它存储左右节点.当除了一些虚假测试用例之外,当时间复杂度完全没有改善时,为什么增加空间复杂度.
Tag*_*eev 22
这主要是与安全相关的变化.虽然在正常情况下很少有可能发生很多冲突,如果哈希密钥来自不受信任的来源(例如从客户端收到的HTTP头名称),那么可能并且不是很难专门设计输入,因此生成的密钥将具有相同的哈希码.现在,如果您执行许多查找,您可能会遇到拒绝服务.似乎在野外有相当多的代码容易受到这种攻击,因此决定在Java端解决这个问题.
有关更多信息,请参阅JEP-180.
Hol*_*ger 17
你的问题包含一些错误的前提.
Map,因此不能任意提高数组大小以避免存储桶冲突.甚至理论上的限制是阵列大小最大为2³¹,而有2 2,3可能的哈希码.Strings是一个明显的例子,但即使是Point轴承两个int值或普通Long键也有不可避免的哈希冲突.所以它们可能比你想象的更常见,它在很大程度上取决于用例.Comparable,才会使用其自然顺序.您可能在Web上找到的示例故意使用相同的对象哈希代码来演示实现的使用Comparable,否则将无法显示.他们触发的只是实施的最后手段.| 归档时间: |
|
| 查看次数: |
9044 次 |
| 最近记录: |