Java Map.keySet和Map.values的迭代顺序相同吗?

Java Map.keySet和Map.values的迭代顺序相同吗?,java,collections,Java,Collections,对于类似以下的地图: Map<Integer, Integer> map = ...; map.put(1, 1); map.put(2, 2); map.put(3, 3); map.put(4, 4); …保证将同一序列打印两次 如果没有,例如java.util.HashMap中是否有任何保证?没有,尽管在实践中会发生这种情况(映射没有充分的理由对键和值使用不同的迭代器) 如果要保证迭代顺序,请迭代entrySet(): for(Map.Entry:Map.entrySet()

对于类似以下的地图:

Map<Integer, Integer> map = ...;
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);
…保证将同一序列打印两次


如果没有,例如
java.util.HashMap
中是否有任何保证?

没有,尽管在实践中会发生这种情况(映射没有充分的理由对键和值使用不同的迭代器)

如果要保证迭代顺序,请迭代
entrySet()

for(Map.Entry:Map.entrySet())
// ...

由于您询问了HashMap的问题,还请注意,映射的任何更改都可能会改变迭代顺序,这是映射重新刷新的结果。

否,不保证。一个是
Set
,一个是
Collection
,两者都不保证订单


如果你想维持秩序。可能是
LinkedHashMap()
entrySet()
帮助您。

是。某种程度上。您可以使用的子类,即。这将使钥匙保持自然的顺序。(或者你可以给它一个特定的比较器)。但是当您使用树形图时,您必须确保compareTo方法“必须与equals一致”。有关更多详细信息,请阅读javadocs。但简而言之,是的,您可以对地图进行排序。

可能重复的@assylias:这个问题是关于键集与值的关系。@daxwe是您的问题:如果调用两次,这两个循环是否会打印相同的内容,或者您的问题是:键和值上的循环是否会以相同的顺序打印相应的键/值?parsifal当前选择的答案是错误的。+1即使它们是订购的,也不能保证它们具有相同的顺序。;)我刚刚阅读了,没有
entrySet()
的订单保证。你从哪里得到的?@Roland的目标是得到一把保证与值匹配的钥匙。在执行两个调用(keySet()和values())时,不能保证两个集合的顺序相同。entrySet()根据定义保证了这一点。通常,无法保证对entrySet的两次调用将以相同的顺序生成集合(除了某些类型,如链接的…树…)问题不在于是否可以对映射进行排序,而在于从
keySet()
返回的键集和从
valueSet()返回的值集
将被排序,以便键集中的第n个键对应于值集中的第n个值。没有这样的保证。也不能保证从
keySet()
valueSet()
返回键和值的顺序在两次连续调用中是相同的。
for (Integer i : map.keySet()) System.out.println(i);
for (Integer i : map.values()) System.out.println(i);
for (Map.Entry<Integer,Integer> entry : map.entrySet())
    // ...