避免使用map.get(key)方法

时间:2011-09-27 13:56:49

标签: java keyset

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

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

     element = mapElements.get(elementId); 

     doSomething(element);
}

所以为什么这不好,我该如何解决呢?

感谢。

3 个答案:

答案 0 :(得分:25)

如果您在地图中迭代所有,您可能会这样做:

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);
}

编辑:语法

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

另一点是,如果地图很大,查找每个键的值可能会很昂贵。所以Jon Skeet的建议更有效率。但是,我承认迭代地图入口集的代码有点笨拙。