Hul*_*ulk 5 java iteration collections dictionary language-lawyer
对于给定类型的Map,是否有任何保证迭代由返回的Collection视图keySet,values并且entries方法以相同的顺序迭代?
背景:我想知道是否转型
public static void doSomethingForEachEntry(Map<String, Integer> someMap) {
for (String key : someMap.keySet()) {
doSomething(someMap.get(key));
}
}
Run Code Online (Sandbox Code Playgroud)
至
public static void doSomethingForEachEntry(Map<String, Integer> someMap) {
for (Integer value : someMap.values()) {
doSomething(value);
}
}
Run Code Online (Sandbox Code Playgroud)
保证迭代顺序不变.
虽然除非实现明确定义,否则您不能依赖特定的顺序Map,但API文档中有一句话暗示地图及其所有集合视图都有一个共享顺序:
该地图的顺序被定义为其中在地图上的集合视图迭代返回元素的顺序.
(我的重点)
为了满足这一要求,地图具有固有顺序(即使它可能未被指定,并且可能随着地图的修改而改变),并且所有集合视图必须对应于此顺序.这是否构成了保证,特别是所有第三方地图实施是否都会尊重它,这是另一个问题.
还值得注意的是,这些在Map接口中明确定义为由地图支持的视图(例如,如果从中删除元素keySet,则必须从地图中删除相应的Map条目).这意味着实际上,从正确的实现中获得不同的排序的可能性要小于例如您对集合视图进行浅层复制的情况.Map
说了这么多,如果问题是"这是一个安全的重构吗?" 然后答案是"是的,只要原始代码本身不会被破坏".如果该方法依赖于特定的排序,因此依赖于特定的Map实现,则应该声明该方法仅接受该类型Map.否则,如果底层Map实现发生变化,你就有一个潜在的定时炸弹(我已经看到了现实生活中的软件中断因为JDK更新).
如果某个特定的调用者依赖于特定的顺序,因为它知道它正在传递一个有序的Map实现,那很好,并且该顺序将在您的重构后保留.
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |