Je veux démontrer avec quelques lignes de code qui en Java, que pour comparer deux chaînes ( Voici quelque chose que j'ai essayé: p> Je m'attendais à cette sortie: mais j'ai eu cette sortie: Parcourir Internet, j'ai constaté que certaines implémentations Java optimiseront le code ci-dessus afin que Eh bien, comment puis-je démontrer le problème à l'aide de l'opérateur string code>), vous devez utiliser
égaux () code> au lieu de la Opérateur
== code>.
différentes chaînes code> , parce que avec le test
S1 == S2 code> Je comparais réellement deux références (c.-à-d. adresses) au lieu du contenu de l'objet. p>
mêmes chaînes code>! p>
S1 code> et
S2 code> S2 code> em> répercutera effectivement la même chaîne. P>
== code> lorsque vous comparez des chaînes (ou des objets) dans Java? p> p>
3 Réponses :
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" );
Merci ! Je ne savais pas qu'à utiliser nouveau code> ou non lors de l'instanciation d'une chaîne produirait quelque chose de différent!
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);
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 i> créer de nouvelles instances de ces valeurs à chaque fois. Et comme ils sont immuables, il ne peut pas faire mal à réutiliser i> ces cas.
C'est un bon exemple de motif volant.
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");
En fait, selon les JLS, tous les compilateurs Java devraient effectuer cette optimisation.