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