5

強化された For ループが Java でどのように機能するかを詳しく知りたいです (このループの基本的な使用法と一般的な機能を理解していると仮定します)。

次のコードがあるとします。

String[] a = {"dog", "cat", "turtle"};

for (String s : a) {
  out.println("String: " + s);
  s = in.readLine("New String? ");
}

元のリスト「a」を実際に変更するわけではありません。なぜだめですか?メモリ管理のしくみ 's' は 'a[i]' の同じメモリ セルへの参照ではありませんか?

強化された for ループを使用して元の配列から要素を削除することはできないというオラクルのドキュメントを読みましたが、それは理にかなっています。値を変更する場合も同じですか?

前もって感謝します

4

5 に答える 5

11

's' は 'a[i]' の同じメモリ セルへの参照ではありませんか?

もともと、そうです。しかし、その後in.readLine、新しい String オブジェクトへの参照を生成し、それを使用して を上書きしますs。ただしs、基になる文字列や配列内の参照ではなく、上書きされるだけです。

于 2013-01-03T10:43:09.350 に答える
5

sStringインスタンスを指すローカル変数です。には関連付けられていませa[i]ん。たまたま最初に同じ値を持っているだけです。

于 2013-01-03T10:43:49.150 に答える
3

あなただけが書くことができます

for (int i = 0; i < a.length; i++) {
  out.println("String: " + a[i]);
  a[i] = in.readLine("New String? ");
}

for-eachループを使用して、元のコレクションまたは配列を変更することはできません。

于 2013-01-03T10:50:45.487 に答える
1

反復ごとに、Stringは最初にStringa[]内の対応するStringオブジェクトを参照します。ただし、in.readLine()によって返される別のStringオブジェクトを参照します。

于 2013-01-03T11:27:10.190 に答える
1

オブジェクトへのアドレスsのように考えてください。ここで重要なのは、for ループを使用するときに配列の特定の値を指しているということです。ループ内でreassing すると、別の値を指すことが起こりますが、指しているアドレスを変更しているだけなので、配列の元の値は変更されません。sss s

String[] a = {"dog", "cat", "turtle"};

for (String s : a) {
  //s --> "dog"
  out.println("String: " + s);
  s = in.readLine("New String? ");
  //s --> the new string the user inputs
}
于 2013-01-03T10:53:39.880 に答える