对给定Map的不同Collection视图的迭代顺序是否保证一致?

时间:2016-01-25 10:02:43

标签: java dictionary collections iteration language-lawyer

对于给定类型的Map,是否有任何保证可以迭代keySetvaluesentries方法返回的Collection视图购买?

背景:我想知道是否转型

public static void doSomethingForEachEntry(Map<String, Integer> someMap) {

    for (String key : someMap.keySet()) {
        doSomething(someMap.get(key));
    }       
}

public static void doSomethingForEachEntry(Map<String, Integer> someMap) {

    for (Integer value : someMap.values()) {
        doSomething(value);
    }       
}
保证

保持迭代顺序不变。

2 个答案:

答案 0 :(得分:7)

虽然您不能依赖特定排序,除非Map实现明确定义它,但有一句话in the API documentation暗示那里是地图及其所有集合视图的单一共享顺序:

  

地图的顺序定义为地图集合视图上的迭代器返回其元素的顺序。

(我的重点)

为了满足这一要求,地图具有固有顺序(即使它可能未被指定,并且可能随着地图的修改而改变),并且所有集合视图必须对应于此顺序。这是否构成保证,特别是所有第三方地图实施是否都会尊重它,是另一个问题。

还值得注意的是,这些在Map界面中明确定义为由地图支持的视图,(例如,如果您从{删除元素) {1}},相应的keySet条目必须从地图中删除)。这实际上意味着您从正确的Map实施中获得的排序不太可能比例如您制作集合视图的浅层副本的情况更少。

说了这么多,如果问题是&#34;这是一个安全的重构吗?&#34;然后答案是&#34;是的,只要原始代码本身没有被破坏&#34;。如果该方法依赖于特定的排序,因此依赖于特定的Map实现,则应声明该方法仅接受该类型的Map。否则,如果基础Map实现在行中发生变化,则可能存在潜在的定时炸弹(并且由于JDK更新,我在现实生活中看到了软件中断)。

如果某个调用者依赖于特定的排序,因为它知道它已经通过了有序的Map实现,那很好,那个顺序将被保留在你的重构之后。

答案 1 :(得分:0)

迭代顺序取决于您使用的Map的具体实现。如果您知道地图类型,请参阅文档。如果不这样做,则不要依赖任何迭代顺序。