String s = "hello";
String backup_of_s = s;
s = "bye";
À ce stade, la variable de sauvegarde contient toujours la valeur d'origine "hello" (c'est à cause de l'immutabilité de String, n'est-ce pas?).
Mais est-il vraiment sûr de copier des Strings avec cette méthode (qui n'est bien sûr pas sûre pour copier des objets mutables réguliers), ou vaut-il mieux écrire ceci ?:
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
En d'autres termes, quelle est la différence (s'il y en a une) entre ces deux extraits de code ?
MODIFICATION - la raison pour laquelle le premier extrait de code est sûr :
Laissez-moi expliquer les choses avec un peu plus de détails, basé sur les bonnes réponses déjà données (qui étaient essentiellement centrées sur la question de la différence de performance entre les 2 extraits de code) :
Les Strings sont immuables en Java, ce qui signifie qu'un objet String ne peut pas être modifié après sa construction. Ainsi,
String s = "hello";
crée une nouvelle instance de 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 de sorte qu'elle fasse référence à l'objet actuellement référencé par s
.
Remarque : l'immutabilité de String garantit que cet objet ne sera pas modifié : notre sauvegarde est sûre
Remarque 2 : le mécanisme de collecte des déchets de 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'immutabilité, c'est le seul moyen), et modifie la variable s
de sorte qu'elle fasse maintenant référence au nouvel objet.