3

我需要复制从 HashMap 类的函数 entrySet() 返回的集合上的排序。我不明白它是如何排序的。

以下代码:

HashMap<String, Integer> testList = new HashMap<String, Integer>();
testHash.put("B", 1);
testList.put("A", 3);
testList.put("E", 2);
testList.put("D", 5);
testList.put("C", 4);

//testList.put("B", 1);
//testList.put("C", 4);
//testList.put("A", 3);
//testList.put("E", 2);
//testList.put("D", 5);

for (Map.Entry<String, Integer> entry : testList.entrySet()) {
    System.out.println(entry.getKey() + " - " + entry.getValue());
}

回报:

D - 5
E - 2
A - 3
B - 1
C - 4

为什么?注释掉的代码以相同的顺序返回它们。

4

1 回答 1

4

我不明白它是如何排序的。

那是因为它不遵循任何特定的顺序。实际排序取决于您放入的项目的哈希码、放入它们的顺序以及哈希桶的数量(与负载因子密切相关)。

无论我以何种顺序将项目放入 中HashMap,它总是以相同的顺序返回它们。

那是因为项目的数量相同,项目的哈希码相同,并且您没有遇到由于哈希冲突导致输出重新排序的顺序。

可以构造一个排序,它会为同一组项目产生稍微不同的输出。然而,外卖的教训是订单不可靠,所以你不应该期望你的物品以任何特定的顺序出现。

如果您必须维护特定的顺序,Java 提供了两个不错的选择:

  • 您可以使用LinkedHashMap基于插入顺序的可预测顺序,或者
  • 您可以使用TreeMap哪些订单您的物品在钥匙上。
于 2015-04-03T01:46:15.033 回答