Comparaison de chaînes avec == lorsqu'elles sont déclarées finales en Java
En Java, l'opérateur == compare les références mémoire de deux objets. Cependant, lorsque les chaînes sont déclarées comme finales et initialisées avec des constantes de compilation, un comportement unique se produit.
Scénario 1 : chaînes non finales
Considérez le code suivant segment :
String str1 = "str"; String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
Le résultat de ce code serait faux. L'opération de concaténation crée un nouvel objet String, qui n'est pas égal à la chaîne littérale préexistante "string".
Scénario 2 : Chaînes finales
Maintenant, passons déclarer les chaînes comme finales :
final String str1 = "str"; final String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
Étonnamment, le résultat est maintenant vrai. En effet, déclarer les chaînes comme finales permet au compilateur d'intégrer leurs valeurs et de traiter l'expression entière comme une expression constante au moment de la compilation.
Optimisation du compilateur : stage
Lorsqu'une expression constante au moment de la compilation implique une chaîne, la machine virtuelle Java (JVM) l'interne, ce qui signifie qu'elle stocke une instance unique de la chaîne dans un emplacement spécial appelé chaîne. piscine. Ainsi, la chaîne concaténée dans le deuxième scénario est directement comparée à la chaîne interne "string", ce qui donne un résultat vrai.
Conclusion
Déclarer les chaînes comme finales avec Les constantes de compilation conduisent l'optimiseur à traiter l'expression comme un seul objet String, permettant des vérifications d'égalité syntaxique (==) avec des littéraux de chaîne préexistants. Cela démontre l'optimisation du compilateur en Java et son impact sur les comparaisons d'identité d'objet.
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!