2013-01-03 13 views
5

詳細ループの基本的な使い方と一般的な動作の仕組みを理解していますか? 。それは実際に元のリスト「」は変更されませんJava拡張Forループ - 元の配列値を編集する

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

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

は、次のコードを考えます。 なぜですか?メモリ管理の仕組み's'の同じメモリセルへの参照ではないのですか?

オラクルのドキュメントでは、拡張forループを使用して元の配列から要素を削除することはできませんが、意味があります。値を変更するのと同じですか?事前に

おかげ

+3

文字列は不変です.. http://stackoverflow.com/a/8798424/112500 – Shashi

+0

's'は、コンテナの要素への参照を含む変数です。 –

答えて

10

'S' '[I]' の同じメモリセルへの参照はありませんか?

元は、はい。しかし、in.readLineは新しいStringオブジェクトへの参照を生成し、それを使ってsを上書きします。しかし、sのみが上書きされ、下位の文字列や配列の参照は上書きされません。

+0

ありがとう、これは本当に役に立ちました。今は明らかです。 – jnardiello

+1

@Oliver、あなたは、s = new String( "X")のとき、リファレンスが[i]ではなく他の文字列オブジェクトを参照し始めることを意味しますか? – Abhinav

+1

@Abhinav:はい.. –

4

sは、Stringインスタンスを指すローカル変数です。 a[i]には関連付けられていませんが、最初は同じ値になります。あなただけがために、それぞれ使用することはできません

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

を書くことができます

3

は、元のコレクションまたは配列を変更するためにループします。

+0

あなたはまだぼやけていた最後の点を明確にしました。どうもありがとう! – jnardiello

+1

リストのエントリを削除()または変更する場合は、イテレータを明示的に使用する必要があります。 –

1

sのように、のアドレスのように考えてください。ここでは、sがforループを使用しているときに配列の特定の値を指し示しているということです。ループ内にsがあると、sが別の値を指しているだけですが、アドレスを変更するだけで、配列の元の値は変更されません。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 
} 
+1

詳細な回答をいただきありがとうございます。私が欠けていたのは、readLineが新しいアドレスを返すという事実です。 – jnardiello

+0

あなたの質問に答える場合は、自由にupvoteして回答を受け入れる;) – Averroes

1

繰り返しごとに、Stringは最初にString a []の対応するStringオブジェクトを参照します。しかし、それはin.readLine()によって返される別のStringオブジェクトを参照します。

関連する問題