LoginSignup
6
4

More than 5 years have passed since last update.

MapのkeySetを回していたら、entrySetの方が適切かを考えてみよう

Posted at

実に恥ずかしいお話です・・・
つぎのようなコードを書いていたらfindbugsから指摘を受けました。

Map<String,String> map = ....;
for(String key: map.keySet()) {
    String value = map.get(key);
    Hoge hoge = new Hoge(key, value);  
  hoge.save();   
}


findbugs曰く、

WMI_WRONG_MAP_ITERATOR

このメソッドは、keySet イテレータから取り出されたキーを使用して、マップエントリの値にアクセスしています。 Map の entrySet イテレータを使用した方が Map.get(key) ルックアップを回避するのでより効率的です。

つまり、「keyとvalueの両方使うのなら、entrySetでfor文を回しなさい」ということ...

Map<String,String> map = ....;
for(Entry<String,String> entry: map.entrySet()) {
    Hoge hoge = new Hoge(entry.getKey(), entry.getValue())
    hoge.save()
}

上のようにしたら怒られなくなりましたw
(この場合、Hogeのコンストラクタの引数をEntryにする方がよいでしょうけど)

まとめ

MapのkeySetを回して処理しているときに、map#getでvalueを取得しているなら、entrySetを回した方が効率も良いし、読みやすい、ということでした。なんかいけてないと思っていったのがようやく解消できました。。。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4