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

时间:2012-09-05 17:45:07

标签: java collections

对于像这样的地图:

Map<Integer, Integer> map = ...;
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);

这是代码......

for (Integer i : map.keySet()) System.out.println(i);
for (Integer i : map.values()) System.out.println(i);

...保证两次打印相同的序列?

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

3 个答案:

答案 0 :(得分:17)

不,没有保证,虽然在实践中它会发生(没有充分的理由让地图为键和值使用不同的迭代器)。

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

for (Map.Entry<Integer,Integer> entry : map.entrySet())
    // ...

由于您询问HashMap,因此请注意,对地图的任何更改都可能会更改迭代顺序,这是因为mapbeing已重新定位。

答案 1 :(得分:7)

不,不保证。一个是Set,一个是Collection,既不保证订单。

如果您想保留订单。可以LinkedHashMap()entrySet()帮助您。

答案 2 :(得分:-1)

是。有点。您可以使用SortedMap的子类,即TreeMap。这将使密钥保持自然顺序。 (或者你可以给它一个特定的比较器)。但是当你使用树形图时,你必须确保compareTo方法“必须与equals一致”。阅读javadocs了解更多详情。但简而言之,是的,你可以对地图进行排序。