開発しています
2007-06-14
■[Java]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";
}
トラックバック - http://d.hatena.ne.jp/argius/20070614/1181843715
リンク元
- 10 http://search.yahoo.co.jp/search?p=イキガミ 4巻&ei=UTF-8&fr=bb_top_v2&x=wrt
- 8 http://search.yahoo.co.jp/search?p=21世紀少年+下&rs=2&tid=top_v2&ei=UTF-8&search_x=1&y=17&fr=top_v2&yuragi=off
- 5 http://search.yahoo.co.jp/search?p=衛星ウサギテレビ&fr=top_v2&tid=top_v2&ei=euc-jp&search.x=1&x=12&y=10
- 3 http://d.hatena.ne.jp/keyworddiary/Perl?date=20070614
- 3 http://reader.livedoor.com/reader/
- 3 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=ObjectInputStream+16進&num=50
- 2 http://comic.matome.jp/keyword/ストーンオーシャン
- 2 http://digital.matome.jp/keyword/cygwin
- 2 http://ezsch.ezweb.ne.jp/search/ezGoogleMain.php?query=GANTZ+多恵&start-index=7&adpage=2&mode=03
- 2 http://search.yahoo.co.jp/search?p=巨大たこ&ei=UTF-8&fr=top_v2&x=wrt
Stew - 汎用JDBCフロントエンド




いずれにしても、よく考えずに使ってたってことですね。反省です...
ありがとうございました。