【问题标题】:Avoiding map.get(key) method避免 map.get(key) 方法
【发布时间】:2011-09-27 13:56:49
【问题描述】:

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

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

     element = mapElements.get(elementId); 

     doSomething(element);
}

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

谢谢。

【问题讨论】:

标签: java keyset


【解决方案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】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 2015-04-21
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多