HashMap中元素的检索顺序是否真的随机化?

时间:2014-09-24 14:49:09

标签: java hashmap

从HashMap中检索条目是否真的随机化?或者它是否依赖于对条目进行哈希处理的桶,然后以某种预定义的顺序访问这些桶?或内部发生的任何其他类型的订单?

2 个答案:

答案 0 :(得分:6)

答案b - 它取决于对条目进行哈希处理的桶,然后以某种预定义的顺序访问这些桶

答案 1 :(得分:2)

当您在get上为非空密钥调用HashMap方法时会发生什么:

  1. 调用密钥的hashCode()方法。

  2. 该哈希的哈希桶是通过简单获取并使用桶的数量来获得的 - 1这是有效的,因为实现确保了桶的数量始终是2的幂。因为buckets只是HashMap.Entry个对象的java数组,结果整数可以用作普通数组索引。这就是O(1)复杂性的来源。

  3. 对存储桶中的条目(链接列表)进行迭代,直到找到一个哈希和密钥与您想要的匹配的位置。这是O(1)复杂性开始恶化的最坏情况O(n)。

  4. 因此,您可以看到HashMap的有效使用将尝试最小化在桶中最终结合在一起的条目数。在这方面最重要的是将哈希码中的位从位0分配到位N-1,其中N是用于计算桶数的2的幂。哈希码中超出该限制的所有位都被屏蔽掉,并且只在桶列表的迭代期间再次使用。