String s = "hello";
String backup_of_s = s;
s = "bye";
À ce stade, la variable de sauvegarde contient toujours la valeur d'origine "bonjour" (c'est à cause de l'immuabilité de String, n'est-ce pas?).
Mais est-il vraiment sûr de copier des chaînes avec cette méthode (ce qui n'est bien sûr pas sûr de copier des objets mutables réguliers), ou est-il préférable d'écrire ceci? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
En d'autres termes, quelle est la différence (le cas échéant) entre ces deux extraits?
EDIT - la raison pour laquelle le premier extrait de code est sûr:
Permettez-moi juste d'expliquer les choses avec un peu plus de détails, en fonction des bonnes réponses déjà fournies (qui étaient essentiellement axées sur la question de la différence de performance entre les 2 extraits):
Les chaînes sont immuables en Java, ce qui signifie qu'un objet String ne peut pas être modifié après sa construction. Par conséquent,
String s = "hello";
crée une nouvelle instance String et assigne son adresse à s
( s
étant une référence à l'instance / objet)
String backup_of_s = s;
crée une nouvelle variable backup_of_s
et l'initialise afin qu'elle référence l'objet actuellement référencé par s
.
Remarque: l'immuabilité des chaînes garantit que cet objet ne sera pas modifié: notre sauvegarde est sûre
Remarque 2: le mécanisme de récupération de place Java garantit que cet objet ne sera pas détruit tant qu'il est référencé par au moins une variable ( backup_of_s
dans ce cas)
Enfin, s = "bye";
crée une autre instance de String (en raison de l'immuabilité, c'est le seul moyen) et modifie la s
variable afin qu'elle référence maintenant le nouvel objet.
s
de référence pour faire référence à un objet différent (leString
"bye"). Cela n'affecte pas ce à quoi la variable de référencebackup_of_s
fait référence (leString
"bonjour"). Comme je l'ai dit, je pourrais donner un exemple équivalent avecStringBuilder
s, qui ne sont pas immuables. Mon commentaire concerne principalement l'instruction OPs: à ce stade, la variable de sauvegarde contient toujours la valeur d'origine "bonjour" (c'est à cause de l'immuabilité de String, n'est-ce pas?).Les chaînes sont des objets immuables , vous pouvez donc les copier simplement en y copiant la référence, car l'objet référencé ne peut pas changer ...
Vous pouvez donc copier comme dans votre premier exemple sans aucun problème:
la source
Votre deuxième version est moins efficace car elle crée un objet chaîne supplémentaire lorsqu'il n'est tout simplement pas nécessaire de le faire.
L'immuabilité signifie que votre première version se comporte comme vous l'attendez et est donc l'approche à privilégier.
la source
Le deuxième cas est également inefficace en termes de pool de chaînes, vous devez appeler explicitement intern () sur renvoi de référence pour le rendre interne.
la source
Que diriez-vous de copier comme ça? Je pense qu'il est préférable d'obtenir une nouvelle copie, de sorte que les données de
str1
ne soient pas affectées lors de lastr2
référence et modifiées dans une action ultérieure.la source
String
est immuable. cloner des chaînes n'a pas beaucoup de sens.