避免 map.get(key) 方法

2022-09-03 12:26:58

我有以下代码,但我看到在迭代Map键时从Map中检索值是一个错误,即使使用findBugs,我也会收到警告keySet()WMI_WRONG_MAP_ITERATOR

for(String elementId : mapElements.keySet()){

     element = mapElements.get(elementId); 

     doSomething(element);
}

那么为什么这不好,我该如何解决它?

谢谢。


答案 1

如果要迭代地图中的所有内容,则最好执行以下操作:

for (Map.Entry<String, String> entry : mapElements.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    // Use the key and the value
}

或者,如果您真的不需要键,只需循环访问这些值:

for (String value : mapElements.values()) {
    doSomething(value);
}

编辑:语法


答案 2

在迭代地图本身的同时从地图中检索值不是问题 - 当您在修改地图的同时迭代地图时,就会成为问题。在你的情况下,情况似乎并非如此,所以这本身并不危险。

当您迭代映射时,您获得的迭代器基于获取迭代器时所有映射条目的快照。在随后的中间化中,这个迭代器的行为变得未定义。这是不好的。但同样,在您的情况下,这不适用,因为您没有更新地图。


推荐