argius note

プログラミング関連

MapのiterationはentrySet().iterator()を使う

FindBugsで気づいたんですが、下記のようなコードはパフォーマンス的によろしくないのでした。

Map map = new HashMap();
// ...
for (Iterator it = map.keySet().iterator(); it.hasNext();) {
    Object key = it.next();
    Object value = map.get(key);
}

これは、こう書くべきでした。

Map map = new HashMap();
// ...
for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
    Map.Entry entry = (Map.Entry)it.next();
    Object key = entry.getKey();
    Object value = entry.getValue();
}

何も考えずにkeySet()のほうを使ってたんですが、言い訳させていただくと、おそらくPerlのイディオムをそのまま置き換えたためと思われます。ちなみに、Perlのhash-iterationは次のようにします。

my %hash = (a => "A",
            b => "B");
for my $key (keys %hash) {
  printf qq{%s="%s"\n}, $key, $hash{$key};
}

追記:Perlもeachを使えば出来るとコメントいただきました。普通にPerlのマニュアルにサンプルコードがありましたね...

while (my ($key,$value) = each %ENV) {
  print "$key=$value\n";
}