对于给定类型Map
,是否可以保证迭代返回的 Collection 视图keySet
, values
and entries
方法以相同的顺序迭代?
背景:我想知道是否要转型
public static void doSomethingForEachEntry(Map<String, Integer> someMap) {
for (String key : someMap.keySet()) {
doSomething(someMap.get(key));
}
}
to
public static void doSomethingForEachEntry(Map<String, Integer> someMap) {
for (Integer value : someMap.values()) {
doSomething(value);
}
}
保证保持迭代顺序不变。
虽然你确实不能依赖特定的顺序除非Map
实现明确定义了它,有一句话在 API 文档中 https://docs.oracle.com/javase/8/docs/api/java/util/Map.html这意味着地图及其所有集合视图有一个共享顺序:
The 地图的顺序定义为地图集合视图上的迭代器返回其元素的顺序。
(我的重点)
为了满足这一点,映射具有固有的顺序(即使它可能未指定,并且可能会随着映射的修改而改变),并且所有集合视图必须对应于该顺序。这是否构成保证,特别是所有第三方地图实现是否都会遵守它,是另一个问题。
还值得注意的是,这些在Map
接口为由地图支持的视图,(例如,如果您从keySet
, 相应的Map
entry must从地图上删除)。这意味着实际上您不太可能从正确的位置获得不同的顺序Map
例如,如果您制作了集合视图的浅拷贝,那么它的实现就不会那么糟糕。
话虽如此,如果问题是“这是一个安全的重构吗?”那么答案是“是的,只要原始代码本身没有被破坏”。如果该方法依赖于特定的顺序,因此依赖于特定的Map
实现时,该方法应该被声明为只接受该类型Map
。否则,如果潜在的潜在的定时炸弹Map
实现发生了变化(我在现实生活中见过软件因为 JDK 更新而崩溃)。
如果一个特定的caller依赖于特定的顺序,因为它知道它正在传递一个有序的Map
实现,这很好,并且该顺序将在重构后保留。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)