Pourquoi ne pas le changement de chaîne lors de la modification élément de tableau de chaînes

user134505:

Je suis incapable de comprendre pourquoi une chaîne ne fonctionne pas comme un objet tel que lorsque vous modifiez, la variable elle est affectée à des changements aussi.

Je l' ai essayé de faire un tableau de chaînes, puis affecté à une variable (je dis référence depuis ce que je comprends Java est passe par la valeur et une référence de mémoire est que la « valeur ») la référence d'un élément
Lorsque j'ai changé la chaîne la variable élément ne reflète pas le changement.

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"

Peut-être, de ce que j'ai lu, l'opérateur d'affectation ne fonctionne pas comme ça pour cordes.

Tschallacka:

Les chaînes sont immuables. Cela signifie que leur valeur ne change jamais. Leurs références peuvent se réaffectés, qui est ce qui se passe ici.

Un calendrier dans les commentaires:

// 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"

Je dis référence depuis ce que je comprends Java est passe par la valeur et une référence de mémoire est que la « valeur »

Presque correct.
Une référence est une adresse. La valeur peut être trouvée dans la mémoire à cette adresse.

Donc ce que vous avez est:
variable = lisible par l' homme. Pomme.
référence = adresse de mémoire. Lisible par ordinateur.
= valeur des octets en mémoire à une adresse donnée.

Alors, quand vous faites

 String s = arr[1];

Vous assignez l'adresse de mémoire qui a été liée à la variable arr[1]à la variable s. La valeur dans la RAM est intacte et ne change pas.

Lorsque vous faites

 arr[1] += "123r";

Vous créez une nouvelle chaîne entière.
Élargi c'est ce qui se passe pas pour l' étape.

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

Alors arr[1]obtient attribué l'adresse mémoire / référence du résultat de l'opération après la =
Cette action n'a cependant aucun rapport à la variable s, car cette variable contient l'adresse de la chaîne d' origine, et il n'y a pas de code à mettre à jour cette référence / adresse mémoire.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=231459&siteId=1
conseillé
Classement