Maison > Java > javaDidacticiel > Pourquoi la comparaison `==` des chaînes finales en Java renvoie-t-elle parfois vrai et parfois faux ?

Pourquoi la comparaison `==` des chaînes finales en Java renvoie-t-elle parfois vrai et parfois faux ?

Susan Sarandon
Libérer: 2024-11-30 16:42:14
original
253 Les gens l'ont consulté

Why Does `==` Comparison of Final Strings in Java Sometimes Return True and Sometimes False?

Comparaison des chaînes finales avec == en Java

Les chaînes en Java, étant immuables, se comportent de manière unique lorsqu'elles sont déclarées comme finales. Considérez le code suivant :

String str1 = "str";
String str2 = "ing";
String concat = str1 + str2;

System.out.println(concat == "string"); // false
Copier après la connexion

Ici, la comparaison renvoie false, car "==" compare les références d'objet. Cependant, si nous déclarons les chaînes finales :

final String str1 = "str";
final String str2 = "ing";
String concat = str1 + str2;

System.out.println(concat == "string"); // true
Copier après la connexion

Maintenant, la comparaison renvoie inexplicablement vrai.

Raison

Chaînes finales initialisées avec des expressions constantes à la compilation, comme dans l'exemple ci-dessus, deviennent des variables constantes et acquièrent une propriété unique : elles sont internées. L'internement signifie que des instances uniques de chaînes sont partagées.

Dans le deuxième extrait de code, le résultat de la concaténation "chaîne" est interné au moment de la compilation. Ainsi, il partage la même référence que la chaîne littérale "string" passée à "==". Il en résulte une véritable comparaison.

Analyse du bytecode

La différence entre les deux versions peut être vue dans leur bytecode :

  • Non -version finale : crée StringBuilder et concatène les chaînes au moment de l'exécution, créant ainsi un nouvel objet String.
  • Version finale : Insère la chaîne concaténée « string » au moment de la compilation, directement en utilisant les instances internes référencées.

Conclusion

Les chaînes finales avec des expressions constantes au moment de la compilation en Java sont internés et partager des instances uniques. Cela peut conduire à des résultats inattendus lors de leur comparaison à l'aide de "==" car il vérifie directement les références d'objet plutôt que leurs valeurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal