7
votes

Démontrant la comparaison de chaînes avec Java

Je veux démontrer avec quelques lignes de code qui en Java, que pour comparer deux chaînes ( string ), vous devez utiliser égaux () au lieu de la Opérateur == .

Voici quelque chose que j'ai essayé: xxx

Je m'attendais à cette sortie: différentes chaînes , parce que avec le test S1 == S2 Je comparais réellement deux références (c.-à-d. adresses) au lieu du contenu de l'objet.

mais j'ai eu cette sortie: mêmes chaînes !

Parcourir Internet, j'ai constaté que certaines implémentations Java optimiseront le code ci-dessus afin que S1 et S2 S2 répercutera effectivement la même chaîne.

Eh bien, comment puis-je démontrer le problème à l'aide de l'opérateur == lorsque vous comparez des chaînes (ou des objets) dans Java?


1 commentaires

En fait, selon les JLS, tous les compilateurs Java devraient effectuer cette optimisation.


3 Réponses :


17
votes

Le compilateur fait quelques optimisations dans votre cas de sorte que s1 code> et s2 code> est vraiment le même objet. Vous pouvez contourner cela en utilisant

String s1 = new String( "Hello" );
String s2 = new String( "Hello" );


1 commentaires

Merci ! Je ne savais pas qu'à utiliser nouveau ou non lors de l'instanciation d'une chaîne produirait quelque chose de différent!



2
votes

Eh bien, comment puis-je démontrer le problème à l'aide de l'opérateur == lors de la comparaison des chaînes (ou des objets) en Java? P>

Voici un moyen: p>

Integer s = -129;
Integer t = -129;
System.out.println(s == t);

3 commentaires

Merci. Je ne savais pas la mise en cache de valeurs -128..127. Je ne suis pas sûr de comprendre la raison pour laquelle Java fait cela, mais c'est bon de savoir!


@ Jérôme, cela se fait parce que les développeurs ont pensé (penser) ces valeurs ont été utilisées si souvent qu'il était bénéfique pour pas créer de nouvelles instances de ces valeurs à chaque fois. Et comme ils sont immuables, il ne peut pas faire mal à réutiliser ces cas.


C'est un bon exemple de motif volant.



0
votes

Java maintient une piscine à cordes dans l'espace de tas, où il essaie d'avoir plusieurs références pour les mêmes valeurs si possible.

Avez-vous écrit: p>

   String s1 = new String ("Hello");
   String s2 = new String ("Hello");


0 commentaires