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.