JavaはIteratorを使うべき理由
ちょっと大人げないかもしれませんが・・・
未来の日記 〜人間ってこんなもの〜 - メモ
イテレータってこんな遅いのか。
半分正解で半分間違い。
多分(呼び出し元が書いてないので何とも言えないが結果から見ると)、
ArrayListを使ってるから
そうなっただけ。
実際にやってみればすぐにわかる。
結果が如実に表れるようにStringBuffer使ってますが、
普通はStringBuilder使いましょう(これもTigerから)
結果
== ArrayList Start ==
拡張for文: 761
for文(Iterator): 597
for文(size毎回取得): 554
for(size初期取得): 548
== ArrayList End ==
== LinkedList Start ==
拡張for文: 582
for文(Iterator): 515
for文(size毎回取得): 181531
for(size初期取得): 176813
== LinkedList End ==
LinkedListだとあり得ないほどIteratorの方が早い。
確かに、普通はArrayListを使うだろうし
たとえLinkedListを使うことがあった場合でも
本来ならコストを考えてそれぞれfor文の書き方を変えた方が良い。
だけど、例えば他のフレームワークから
Listを所得してるとき。
中でどのListが生成されているかを調べなきゃ行けないし
バージョンによって変わるかもしれない。
今までArrayListが返ってきていたから
getでfor文を書いていたとき。
フレームワークをバージョンアップして
もしもそこがLinkedListになっていたら
それだけでかなりのパフォーマンスの低下になる。
(Iteratorの誤差など遙か彼方へ吹き飛ぶほどに)
そのリストを使っているfor文を全部調べ上げて
すべて書式を変更するのはかなりの作業になるだろう。
だから、JavaではIteratorを使うべきだ。
さらに言うと、今までListだった物が
重複を許さなくなりSetになったり
諸々の理由で配列になることもあるかもしれない。
そう言うときも拡張for文にしておけば
for文を書き換える必要がない。
ちなみに何度も言うが拡張for文が取り入れられたのは
もう2年も前の話だ。
Java1.0がリリースされたのが10年前(もうすぐ11年)だから
もうすでに1/5の期間経っていることになる。
あ、あとメリークリスマス♪
(何やってるんだ・・・俺・・・orz)