13

私は次のコードを持っていますが、マップキーを繰り返し処理しながらマップから値を取得することkeySet()は、findBugsを使用しても間違いであることがわかりました。警告が表示されますWMI_WRONG_MAP_ITERATOR

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

     element = mapElements.get(elementId); 

     doSomething(element);
}

では、なぜこれが良くないのか、どうすれば修正できますか?

ありがとう。

4

3 に答える 3

27

マップ内のすべてを反復処理している場合は、次のようにすることもできます。

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

編集: 構文

于 2011-09-27T13:58:47.100 に答える
0

もう 1 つのポイントは、マップが大きい場合、各キーの値を検索するとコストがかかる可能性があることです。したがって、Jon Skeet の提案はより効率的です。ただし、マップのエントリ セットを反復処理するためのコードが少しぎこちないことは認めます。

于 2011-09-27T14:17:25.323 に答える
0

マップ自体を反復しながらマップから値を取得することは問題ではありません。問題になるのは、マップを同時に反復しながらマップを変更する場合です。あなたの場合、これは当てはまらないので、これ自体は危険ではありません。

map を反復処理する場合、取得する反復子は、反復子を取得した時点でのすべてのマップ エントリのスナップショットに基づいています。その後の midification では、この反復子の動作は未定義になります。これはよくないことです。ただし、ここでも、マップを更新していないため、これは当てはまりません。

于 2011-09-27T14:05:15.463 に答える