コード内
for (int i: array){
i
各ループ反復で配列内の次の要素の値を取得する変数を宣言しますが、それはその要素への参照ではありません。
の
i = 1;
配列内の要素ではなく、変数に新しい値を割り当てます。
foreach ループで配列要素の値を直接設定することはできません。そのために通常のfor
ループを使用します
for (int i = 0; i < array.length; i++) {
array[i] = ...; // some value
}
上記の例では、宣言された変数i
を配列内の要素へのインデックスとして使用しています。
array[i]
値を変更できる要素自体にアクセスしています。
Ans は明らかに、配列のすべての要素に 1 を割り当てることに失敗しました。System.out.print(i); を追加しました。ループの本体に移動すると、画面の出力が 1111111111 であることがわかりましたが、ループ内で i を使用して何かを行うことは有効であるため、おそらく i は配列のすべての要素のコピーですよね? (最初の質問)
System.out.print(i)
の後にを付けたに違いありませi = 1
ん0000000
。
上記が当てはまる場合、配列の各要素のコピーを作成する必要があるため、foreach ループは一般的な for ループよりもはるかに遅いということではありませんか? または、Java にはポインターとポインター演算がないため、oprator[] は、すべての要素をコピーする方が実際には高速であるという他の「悪い」方法で設計されている可能性があります。
foreach ループがどのように機能するかについては、こちらをご覧ください。配列の場合、
for (int i: array){
i = 1;
}
と同等です
for (int index = 0; index < array.length; index++) {
int i = array[index];
i = 1;
}
だから遅くはない。スタック上でもう 1 つの原始的な作成を行っています。
実装に依存します。配列の場合、決して遅くはありません。それは単に異なる目的を果たします。
一般的な forloop の代わりに、明らかに遅い foreach ループを使用するのはなぜですか?
理由の1つは読みやすさです。もう 1 つは、配列の要素参照を変更する必要はなく、現在の参照を使用する場合です。
参照型の例を見てみましょう
public class Foo {
public int a;
}
Foo[] array = new Foo[3];
for (int i = 0; i < array.length; i++) {
array[i] = new Foo();
array[i].a = i * 17;
}
for (Foo foo : array) {
foo.a = 0; // sets the value of `a` in each Foo object
foo = new Foo(); // create new Foo object, but doesn't replace the one in the array
}
プリミティブ型では、そのようなことは機能しません。
for (int index = 0; index < array.length; index++) {
int i = array[index];
i = 1; // doesn't change array[index]
}