从HashMap中检索条目是否真的随机化?或者它是否依赖于对条目进行哈希处理的桶,然后以某种预定义的顺序访问这些桶?或内部发生的任何其他类型的订单?
答案 0 :(得分:6)
答案b - 它取决于对条目进行哈希处理的桶,然后以某种预定义的顺序访问这些桶
答案 1 :(得分:2)
当您在get
上为非空密钥调用HashMap
方法时会发生什么:
调用密钥的hashCode()
方法。
该哈希的哈希桶是通过简单获取并使用桶的数量来获得的 - 1这是有效的,因为实现确保了桶的数量始终是2的幂。因为buckets只是HashMap.Entry
个对象的java数组,结果整数可以用作普通数组索引。这就是O(1)复杂性的来源。
对存储桶中的条目(链接列表)进行迭代,直到找到一个哈希和密钥与您想要的匹配的位置。这是O(1)复杂性开始恶化的最坏情况O(n)。
因此,您可以看到HashMap
的有效使用将尝试最小化在桶中最终结合在一起的条目数。在这方面最重要的是将哈希码中的位从位0分配到位N-1,其中N是用于计算桶数的2的幂。哈希码中超出该限制的所有位都被屏蔽掉,并且只在桶列表的迭代期间再次使用。