【问题标题】:Why HashMap<K,V> in Java iterates in order? [duplicate]为什么Java中的HashMap<K,V>按顺序迭代? [复制]
【发布时间】:2015-12-23 02:51:33
【问题描述】:

HashMap 总是返回按键排序的值,尽管文档说不能保证:

public static void main(String[] args) {
    HashMap<Integer, String> map = new HashMap<>();
    map.put(8, "B");
    map.put(7, "C");
    map.put(5, "A");
    map.put(10, "Z");
    map.put(3, "D");
    map.put(1, "B");
    System.out.println(map);
    printCollection(map);
}

private static void printCollection(Map<Integer, String> map) {
    for(Map.Entry<Integer, String> pair : map.entrySet()){
        System.out.println(pair.getKey() + " " + pair.getValue());
    }
}

输出: {1=B, 3=D, 5=A, 7=C, 8=B, 10=Z}

1 B
3 D
5 A
7 C
8 B
10 Z

【问题讨论】:

  • 尝试将声明更改为new HashMap&lt;&gt;(4)。这会给你一个不同的顺序。
  • @user1274184 检查下面的答案。我已经举了一个例子。希望这会有所帮助。

标签: java hashmap


【解决方案1】:

您正在使用非常小的密钥集进行测试。 HashMap 的默认大小是 16,所以它是按顺序存储它们并返回。

构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。

Integerhashcode 本身就是值,因此它们将存储在每个存储桶中。

试试这个简单的代码,看看输出:

Map<Integer, String> map = new HashMap<>();
for (int i = 0; i<100; i++) {
  map.put(i, "a");
}
for (Map.Entry entry : map.entrySet())
   System.out.print(entry.getKey() + "  ");

输出:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 16 19 18 21 20 23 22 25 24 27 26 29 28 31 30 34 35 32 33 38 39 36 37 42 43 40 41 5 45 4 0 49型

直到 15 个键被排序,然后它们开始随机传播。

【讨论】:

    【解决方案2】:

    “不保证”并不意味着“从不”。可能你只是运气好,你不应该依赖它。

    如果你想要一个有序的 HashMap,你应该使用LinkedHashMap

    【讨论】:

    • 不是运气,有明确的解释为什么他会得到这个结果(在这种情况下不是随机的)
    • 这是幸运的定义:他得到一个有序列表,而该属性不能保证。显然地图的内部运作不是“魔术”,有一个具体的实现(我知道),但从他的角度来看应该是无关紧要的。
    【解决方案3】:

    是的。你正在遇到这种情况。但不能像医生说的那样保证。如果您继续添加和删除加班,订单将会改变。

    这个类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2018-08-08
      • 2012-12-03
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多