なぜ文字列の変更は、文字列配列の要素を変更していないとき

user134505:

私は、文字列は、あなたがそれを変更すると、それが割り当てられている変数も変化するようなオブジェクトのような作業をしない理由を理解することができませんでしだ。

私は文字列の配列を作る試み、その後変数に一つの要素の参照を割り当てた(私は、Javaの値によってパスであり、私は理解してメモリ参照がその「値」であるから、以降参照言う)
私は文字列を変更しました要素は、変数は変更が反映されていません。

String[] arr={"abc","def"};

String s=arr[1];

arr[1]+="123r";

for (String i:arr) {System.out.print(i);}

System.out.println(); // prints "abcdef123r"

System.out.println(s); //prints "def"

おそらく、私が読んでいたものから、代入演算子は文字列のためにそのような仕事をしません。

Tschallacka:

文字列は不変です。それは彼らの値が変化しないことを意味します。彼らの参照はここに何が起こるかである、再割り当てを受けることができます。

コメントでタイムライン:

// Create two Strings. [string1]="abc", [string2]="def"
// Assign [string1] to arr[0]. 
// Assign [string2] to arr[1].
String[] arr={"abc","def"};

// Get value from arr[1] = [string2]
// Assign [string2] to s
String s=arr[1];

// Get value from arr[1] = [string2]
// create [string3] = "123r"
// create [string4] = [string2] + [string3]
// assign [string4] to arr[1]
arr[1]+="123r";

// get value from arr[0] = [string1]
// print [string1] = "abc"
// get value from arr[1] = [string4]
// print [string4] = "def123r"

for (String i:arr) {System.out.print(i);}

System.out.println(); // prints "abcdef123r"

// get value from s = [string2]
// print value "def"
System.out.println(s); //prints "def"

私は、Javaが値渡しで、メモリ参照がその「値」である私が理解から以来の参照を言います

ほぼ正しいです。
参照アドレスです。値は、そのアドレスでメモリに見つけることができます。

それでは、あなたが持っていることは次のとおりです。
変数=人間が読めます。林檎。
参照=メモリアドレス。コンピュータ読み出し可能。
値は、指定されたアドレスのメモリ内のいくつかのバイトを=。

だから、あなたが行うとき、

 String s = arr[1];

あなたは、変数にリンクされたメモリアドレス割り当てているarr[1]変数にしますsRAMの値はそのままで、変化しません。

あなたがやるとき

 arr[1] += "123r";

あなたはまったく新しい文字列を作成しています。
拡張されたこのステップのためのステップを何が起こるかです。

arr[1] += "123r";
arr[1] = arr[1] + "123r"; 
arr[1] = "def" + "123r";
arr[1] = "def123r";

そうarr[1]=後に演算結果のメモリアドレス/参照を割り当てられます
。このアクションは、しかしながら変数に全く関係がありませんs。この変数は、元の文字列のアドレスを保持し、その参照を更新するコードが存在しないように、/メモリアドレス。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=231458&siteId=1
おすすめ