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

问题描述 投票:0回答:3

这个问题只是出于好奇,但我注意到使用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开始迭代所有可用的数组索引,这将是有意义的,但我可能错了,它比这更复杂。

java hashmap
3个回答
2
投票

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);
        }
    }
}

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


1
投票

来自javadoc

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

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

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.