str
n'est pas un objet, c'est une référence à un objet. "Hello"
et "Help!"
sont deux String
objets distincts . Ainsi, str
pointe vers une chaîne. Vous pouvez modifier ce vers quoi il pointe , mais pas ce vers quoi il pointe .
Prenez ce code, par exemple:
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
Maintenant, il n'y a rien 1 que nous pourrions faire pour s1
cela affecter la valeur s2
. Ils se réfèrent au même objet - la chaîne "Hello"
- mais cet objet est immuable et ne peut donc pas être modifié.
Si nous faisons quelque chose comme ça:
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
Ici, nous voyons la différence entre muter un objet et changer une référence. s2
pointe toujours vers le même objet que celui que nous avions initialement défini s1
. La définition s1
de "Help!"
ne modifie que la référence , tandis que l' String
objet auquel il faisait référence à l'origine reste inchangé.
Si les chaînes étaient mutables, nous pourrions faire quelque chose comme ceci:
String s1 = "Hello";
String s2 = s1;
s1.setCharAt(1, 'a'); // Fictional method that sets character at a given pos in string
System.out.println(s2); // Prints "Hallo"
Modifier pour répondre à la modification de OP:
Si vous regardez le code source de String.replace (char, char) (également disponible dans src.zip dans votre répertoire d'installation JDK - une astuce pro consiste à y regarder chaque fois que vous vous demandez comment quelque chose fonctionne vraiment), vous pouvez voir que ce c'est le cas:
- S'il y a une ou plusieurs occurrences de
oldChar
dans la chaîne en cours, faites une copie de la chaîne en cours où toutes les occurrences de oldChar
sont remplacées par newChar
.
- Si le
oldChar
n'est pas présent dans la chaîne actuelle, renvoyez la chaîne actuelle.
Alors oui, "Mississippi".replace('i', '!')
crée un nouvel String
objet. Encore une fois, ce qui suit tient:
String s1 = "Mississippi";
String s2 = s1;
s1 = s1.replace('i', '!');
System.out.println(s1); // Prints "M!ss!ss!pp!"
System.out.println(s2); // Prints "Mississippi"
System.out.println(s1 == s2); // Prints "false" as s1 and s2 are two different objects
Votre devoir pour l'instant est de voir ce que fait le code ci-dessus si vous changez s1 = s1.replace('i', '!');
en s1 = s1.replace('Q', '!');
:)
1 En fait, il est possible de muter des chaînes (et d'autres objets immuables). Il nécessite une réflexion et est très, très dangereux et ne devrait jamais être utilisé à moins que vous ne souhaitiez réellement détruire le programme.