2
votes

Pourquoi la chaîne ne change-t-elle pas lors de la modification de l'élément du tableau de chaînes

Je ne comprends pas pourquoi une chaîne ne fonctionne pas comme un objet de telle sorte que lorsque vous la modifiez, la variable à laquelle elle est affectée change également.

J'ai essayé de créer un tableau de chaînes, puis je l'ai affectée la référence d'un élément à une variable (je dis référence puisque d'après ce que je comprends, Java est un passage par valeur et une référence mémoire est cette "valeur")
Lorsque j'ai changé l'élément String, la variable 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, d'après ce que j'ai lu, l'opérateur d'affectation ne fonctionne pas comme ça pour Chaînes.


3 commentaires

stackoverflow.com/questions/1552301/…


La chaîne ne fonctionne pas comme un objet, de sorte que lorsque vous la modifiez, la variable qui lui est assignée change également : les chaînes sont des objets et fonctionnent exactement de la même manière que tout autre objet. arr [1] + = "123r" ne "change pas l'objet". Cela équivaut à `arr [1] = arr [1] +" 123r ", c'est-à-dire qu'il crée un nouvel objet String et stocke ce nouvel objet String dans le tableau, à l'index 1.


Hmm, donc l'opérateur d'affectation ne fonctionne pas comme prévu


3 Réponses :


6
votes

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

Une chronologie dans les commentaires:

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

Je dis référence car d'après ce que je comprends, Java est un passage par valeur et une référence mémoire est cette "valeur"

Presque correct.
Une référence est une adresse. La valeur se trouve dans la mémoire à cette adresse.

Vous avez donc:
Variable = lisible par l'homme. pomme.
reference = adresse mémoire. Ordinateur lisible.
valeur = quelques octets en mémoire à une adresse donnée.

Alors quand vous le faites

 arr[1] += "123r";

Vous affectez l'adresse mémoire qui était liée à la variable arr [1] à la variable s . La valeur de la RAM n'est pas modifiée et ne change pas.

Quand vous le faites

 String s = arr[1];

Vous créez une toute nouvelle chaîne.
Développé, voici ce qui se passe étape par étape.

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

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

p>


1 commentaires

Oh! Je comprends, le peu sur l'immuabilité était très instructif. Merci pour votre commentaire utile et détaillé.



1
votes

nous savons que , string est une variable const en java.

  1. Chaîne [] arr = {"abc", "def"}

    pool de variables de chaîne const: "abc", "def"

    arr [0] -> "abc"

    arr [1] -> "def"

  2. Chaîne s = arr [1]

    pool de variables de chaîne const: "abc", "def"

    arr [0] -> "abc"

    arr [1] -> "def"

    s -> "def"

  3. arr[1ITED+="123r"

    pool de variables de chaîne const: "abc", "def", "def123r", "123r"

    arr [0] -> "abc"

    arr [1] -> "def123r"

    s -> "def"


0 commentaires

2
votes

En un mot, le comportement que vous rencontrez est attendu. En Java, les chaînes sont conçues pour être immuables, c'est-à-dire que leurs valeurs NE PEUVENT PAS changer.

Que signifie l'immutabilité des chaînes?

Étudiez l'extrait de code ci-dessous et essayez de prédire quelle serait la sortie sans exécuter le code.

 String s = "Stack";  
 s = s.concat(" overflow"); 
 System.out.println(s);

Que pensez-vous que la sortie soit? Débordement de pile , n'est-ce pas? NAN! le résultat est Stack . Vous pouvez tester et voir par vous-même.

C'est exactement comment une chaîne se comporte.

Bien sûr, nous pouvons modifier la base de code ci-dessus pour qu'elle fonctionne comme nous le voulons en faisant ceci:

 String s = "Stack";  
 s.concat(" overflow"); 
 System.out.println(s);

De cette façon, un nouvel objet est créé et la sortie devient Stack overflow .

J'espère que cela aide. Joyeux codage! Modifié


0 commentaires