Java HashMap keyset()按排序顺序迭代[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java HashMap keyset()按排序顺序迭代[重复]相关的知识,希望对你有一定的参考价值。

这个问题只是出于好奇,但我注意到使用keyset迭代HashMap似乎总是按排序顺序进行。显然,使用HashMaps永远不会保留插入顺序,但排序的键顺序对我来说似乎有点奇怪。使用此示例:

import java.util.HashMap;

public class test {
    public static void main(String[] args) {
        HashMap<Integer, String> someMap = new HashMap<Integer, String>();

        someMap.put(0, "nothing");
        someMap.put(7, "nothing");
        someMap.put(3, "nothing");
        someMap.put(4, "nothing");
        someMap.put(10, "nothing");
        someMap.put(11, "nothing");
        someMap.put(2, "nothing");
        someMap.put(1, "nothing");
        someMap.put(5, "nothing");

        for (Integer someInt : someMap.keySet()) {
            System.out.println(someInt);
        }
    }
}

输出:

0
1
2
3
4
5
7
10
11

这是可靠和一致的吗?如果HashMap实现是一个数组,如果keyset只是从0开始迭代所有可用的数组索引,这将是有意义的,但我可能错了,它比这更复杂。

答案

HashMapsHashSets期间没有特别的保证。您可以通过删除和添加一些元素来排序您的订单。

结帐:

import java.util.HashMap;

public class test {
    public static void main(String[] args) {
        HashMap<Integer, String> someMap = new HashMap<Integer, String>();

        someMap.put(0, "nothing");
        someMap.put(7, "nothing");
        someMap.put(3, "nothing");
        someMap.put(4, "nothing");
        someMap.put(10, "nothing");
        someMap.put(11, "nothing");
        someMap.put(2, "nothing");
        someMap.put(10004, "nothing");
        someMap.put(1, "nothing");
        someMap.put(5, "nothing");

        for (Integer someInt : someMap.keySet()) {
            System.out.println(someInt);
        }
    }
}

在大多数类型的散列集中,散列函数排除特定值的位置。

另一答案

来自javadoc

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

您所看到的可能是关于JVM实现以及如何管理哈希码的巧合,或者可能(但不太可能):

请注意,使用具有相同hashCode()的许多键是减慢任何哈希表性能的可靠方法。为了改善影响,当键是Comparable时,此类可以使用键之间的比较顺序来帮助打破关系。

在任何情况下,这都不可靠或不变。

另一答案

可能是这样;但由于它没有在java文档中记录,因此您不应该根据此类行为进行编码。由于新的Java版本可以更改HashMap实现,这可能会提供非升序订单键;所以根据这种行为你所做的任何代码都会破坏

以上是关于Java HashMap keyset()按排序顺序迭代[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java HashMap keySet() 迭代顺序是不是一致?

java hashmap常见用法

Java HashMap 遍历方式探讨

java集合Map&HashMap

JAVA API HashMap 分析

HashMap keyset()方法