确切地说,哈希映射键的顺序会受到影响,

时间:2015-10-27 13:04:12

标签: java hashmap hashtable hashcode hash-collision

我知道不能保证hashmap中键的顺序。 如果没有重复冲突或哈希冲突,重新排序会发生吗?

3 个答案:

答案 0 :(得分:4)

我们真的不应该担心这个!

在检查HashMap的源代码时,似乎内部它使用了HashMap.Entry对象的数组,用于查找所需条目的数组索引是基于对象的hashCode()和大小的数组。因此,排序与对象的hashCode和Map的大小有关。

然而,这是一个简化,我只看了OpenJDK 6中的实现。

您永远不应该依赖于实施细节。有一个很好的理由为什么有一个名为Map的接口:它定义了应该如何使用它。

答案 1 :(得分:0)

特别是在java.util.HashMap条目中,仅在达到最大阈值时才移动和重新排序。 方法addEntry()调用resize()方法,该方法转移到新表重新排列键

768     void addEntry(int hash, K key, V value, int bucketIndex) {
         //
771         if (size++ >= threshold)
772             resize(2 * table.length);


471    void resize(int newCapacity) {
         //
479         Entry[] newTable = new Entry[newCapacity];
480         transfer(newTable);
481         table = newTable;

答案 2 :(得分:0)

看看这个有趣的link,它详细公开了Hashmap的工作原理: 以下是解释如何放置和工作:

  

具有相同散列值的所有密钥都放在同一个链表(存储桶)中。具有不同哈希值的密钥可以在同一个桶中结束。

     

当用户调用put(K键,V值)或get(Object键)时,该函数计算条目应该在其中的桶的索引。然后,函数遍历列表以查找具有相同键的Entry(使用键的equals()函数)。

     

对于get(),函数返回与条目关联的值(如果条目存在)。

     

在put(K键,V值)的情况下,如果条目存在,该函数将用新值替换它,否则它会在单独的头部创建一个新条目(来自参数中的键和值)链表。