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