从HashMap.entryset()返回的Set,它是如何排序的



我需要复制从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

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

我不明白它是怎么分类的。

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

无论我在HashMap中按哪个顺序放置项目,它总是按相同的顺序返回它们。

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

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

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

  • 您可以使用LinkedHashMap来根据插入顺序进行可预测的顺序,或者
  • 您可以使用TreeMap在钥匙上订购您的物品

最新更新