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
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
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 :
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!