web-dev-qa-db-ja.com

for eachループは空のリストに対してどのように保護しますか?

http://www.leepoint.net/notes-Java/flow/loops/foreach.html を読みます。それぞれに相当する

for (int i = 0; i < arr.length; i++) { 
     type var = arr[i];
      body-of-loop
}

for (type var : arr) {
      body-of-loop
}

私の質問は、空のリストに対してfor eachループがどのように機能するかです。通常のforループの場合、arr.lengthは0と評価され、ループは実行されません。 for eachループについてはどうですか?

26

私の質問は、空のリストに対してfor eachループがどのように機能するかです

ForEachも同様に機能します。長さがゼロの場合、ループは実行されません。

それらの唯一の違いは、リストまたは配列のすべての項目を繰り返したいときにForEachループを使用することです。一方、通常のforループの場合、開始インデックスと終了インデックスを制御できます。

29
Braj

Iterableコレクションの反復子を使用します。リスト。コレクションが空の場合に該当する次のアイテムがない場合にfalseを返すhasnext()メソッドを記述することは、イテレータの実装者の義務です。

6
user3810043

はい、同等です。

リストが空の場合、for-eachサイクルは一度も実行されません。

2
libik

@ user3810043の回答コメントで言及しているように、拡張されたforステートメントは、同等の基本的なforステートメントと同じように文字通り評価されます。

14.14.2。強化されたforステートメント

...

Expressionの型は、Iterableのraw型のサブタイプまたは配列型(§10.1)である必要があります。そうでない場合、コンパイル時エラーが発生します。

...

それ以外の場合、Expressionには必ず配列型T []が含まれます。

L1 ... Lmを、拡張forステートメントの直前のラベルのシーケンス(空の場合もある)とします。

拡張forステートメントは、次の形式の基本forステートメントと同等です。

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}

#aお​​よび#iは、自動生成された識別子であり、拡張forステートメントが発生した時点でスコープ内にある他の識別子(自動生成された、またはその他)とは異なります。

^ Java®言語仕様 からの引用

0
Will Cain