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.
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.