一尘不染

Java从HashMap检索的值的顺序是插入顺序吗?

java

我想弄清楚HashMap中的值被/可以被检索的顺序。这是相同的代码段。

import java.util.HashMap;

public class HashMapExample {

   public static void main(String[] args) {
       HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
       hashmap.put(1, "apple" );
       hashmap.put(2, "lemon" );
       hashmap.put(3, "orange" );
       hashmap.put(4, "banana" );
       hashmap.put(5, "litchi" );
       hashmap.put(6, "mango" );
       hashmap.put(7, "papaya" );

       System.out.println(hashmap.size());

       for (String key : hashmap.values()) {
           System.out.println(key);
       }
   }
}

输出:

7
apple
lemon
orange
banana
litchi
mango
papaya

值按插入顺序打印。这是真的吗?我期望值将以任意顺序打印。这是使用Java 6。


阅读 282

收藏
2020-03-01

共1个答案

一尘不染

值按插入顺序打印。这是真的吗?我期望值将以随机顺序打印。

HashMapAPI没有定义迭代的顺序。

但是,如果查看HashMap的实现,则可以推断出迭代顺序,键的哈希值,键的插入顺序和哈希表的大小之间存在复杂的过渡关系。如果哈希表自行调整大小,则此关系会变得混乱。

在您的情况下,您正在使用Integer键,这意味着键的哈希值本身就是键值。另外,您按键顺序插入了条目。这(幸运地!)导致匹配插入顺序的迭代顺序。但是,如果您继续插入更多的键,则会发现迭代顺序“环绕”。然后,当表格经过一系列调整大小时,顺序将变得越来越混乱。

简而言之,您看到的只是哈希表实现的伪像,而不是您可以(或应该)明智地利用的东西。尤其重要,因为它可以从一个Java版本更改为另一个Java版本。

2020-03-01