拡張for文を使う理由

JDK1.5から利用できる拡張for文を使う理由をまとめました。

  • 見た目がシンプルだから

確かにシンプルです。

List<String> strList = new ArrayList<String>();
//要素追加


//これまでのfor文
for(int i = 0; i < strList.length; i++){
    System.out.println(strList.get(i));
}

//これからのfor文
for(String str : strList){
    System.out.println(str);
}

しかし、理由はこれだけではありません。

  • パフォーマンスも上がるから

実はこれは半分嘘です。
strArrayがArrayList型であった場合、「これまでのfor文」のようにgetした方が30%程度パフォーマンスが上がります。
ですが、仮にstrArrayがLinkedList型であった場合、「これまでのfor文」のようにgetをすると、99%以上パフォーマンスが下がります。
参考ページ:JavaはIteratorを使うべき理由
つまり、strArrayがLinkedList型である場合に、拡張for文を使うとパフォーマンスが上がります。


では、forで回すリストの実装によってfor文を使い分ければいいのではないでしょうか?
しかし、拡張for文にはもう一つ良い点があります。

  • コードの柔軟性が上がる

拡張for文を使っていれば、for文に渡されるオブジェクトがArrayListかLinkedListか分からない場合でも、「99%以上パフォーマンスが下がる」という心配をしなくて済みます。


また、拡張for文は、Listインタフェースの実装型をイテレータを使ったコードに変換し、配列の場合にはインデックスアクセスするコードに変換してくれます。
参考ページ:J2SEトラの穴-拡張 for 文ー実際はどうなってんだ ????


このコンパイラの翻訳によって、for文に渡すリスト又は配列に適したコードが生成されることが分かります。つまり、拡張forさえ使えば何も考えなくていい、何も心配しなくていいということです。まずいことがあればAPIの裏でなんとかしてくれる、ということです。