str
n'est pas un objet, c'est une référence à un objet. "Hello"
y "Help!"
sont deux distincts String
objets. Ainsi, str
Les points suivants une chaîne. Vous pouvez changer ce qu'il Les points suivants mais pas ce qu'elle points à .
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
qui affecterait la valeur de s2
. Ils font référence au même objet - la chaîne de caractères "Hello"
- mais cet objet est immuable et ne peut donc pas être modifié.
Si on fait quelque chose comme ça :
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
Nous voyons ici la différence entre la mutation d'un objet et la modification d'une référence. s2
pointe toujours vers le même objet que celui que nous avions initialement défini. s1
pour pointer vers. Réglage de s1
a "Help!"
ne modifie que le référence tandis que le String
l'objet auquel il se référait à l'origine reste inchangé.
Si les chaînes étaient mutable, on pourrait faire quelque chose comme ça :
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"
Editer pour répondre à l'édition de l'OP :
Si vous regardez le code source pour String.replace(char,char) (également disponible dans src.zip dans votre répertoire d'installation JDK -- un conseil de pro est de regarder là chaque fois que vous vous demandez comment quelque chose fonctionne vraiment) vous pouvez voir que ce qu'il fait est le suivant :
- S'il y a une ou plusieurs occurrences de
oldChar
dans la chaîne de caractères actuelle, faire une copie de la chaîne de caractères actuelle où toutes les occurrences de oldChar
sont remplacés par newChar
.
- Si le
oldChar
n'est pas présent dans la chaîne de caractères actuelle, retourne la chaîne de caractères actuelle.
Alors oui, "Mississippi".replace('i', '!')
crée un nouveau String
objet. Là encore, la règle suivante s'applique :
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 le code ci-dessus fait si vous changez s1 = s1.replace('i', '!');
a s1 = s1.replace('Q', '!');
:)
1 En fait, il es possible de muter des chaînes de caractères (et d'autres objets immuables). Cela nécessite une réflexion et est très, très dangereux et ne devrait jamais être utilisé à moins que vous ne soyez réellement intéressé par la destruction du programme.
1 votes
Str est UNIQUEMENT une référence et non l'objet lui-même
1 votes
J'espère que cela vous aidera pushkarrajpujari.com/article/strings-in-java