185 votes

Comment dois-je copier des chaînes de caractères en Java ?

    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.

132voto

NPE Points 169956

Étant donné que les chaînes de caractères sont immuables, les deux versions sont sûres. Toutefois, la dernière est moins efficace (elle crée un objet supplémentaire et dans certains cas copie les données de caractères).

Dans cette optique, la première version devrait être préférée.

21voto

aleroot Points 30853

Les chaînes de caractères sont des objets immuables donc vous pouvez les copier simplement en copiant la référence vers elles, car l'objet référencé ne peut pas changer ...

Vous pouvez donc copier comme dans votre premier exemple sans aucun problème :

String s = "hello";
String backup_of_s = s;
s = "bye";

10voto

David Heffernan Points 292687

Votre deuxième version est moins efficace car elle crée un objet chaîne supplémentaire alors qu'il n'y a simplement aucune nécessité de le faire.

L'immuabilité signifie que votre première version se comporte comme vous vous y attendez et est donc l'approche à privilégier.

0voto

Amit Yadav Points 1112

Le deuxième cas est également inefficace en termes de regroupement de chaînes de caractères, vous devez appeler explicitement la méthode intern() sur la référence de retour pour la rendre intern.

-14voto

Boon Chiao Points 1
Chaîne str1 = "c'est une chaîne";
Chaîne str2 = str1.clone();

Que diriez-vous de copier de cette façon? Je pense qu'obtenir une nouvelle copie est mieux, de sorte que les données de str1 ne seront pas affectées lorsque str2 est référencé et modifié dans une action ultérieure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X