Comparaison de chaînes et finalité en Java
En Java, les chaînes jouent un rôle central et leur comportement peut être influencé par le mot-clé final. Considérez l'extrait de code suivant :
String str1 = "str"; String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
Ce code concatène deux chaînes, puis le compare à la chaîne littérale à l'aide de l'opérateur d'égalité ==. Le résultat, comme prévu, est faux.
Cependant, lorsque les variables de chaîne sont déclarées finales, le résultat change :
final String str1 = "str"; final String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string");
Dans ce cas, l'expression de comparaison renvoie désormais vrai. Ce changement de comportement soulève la question de savoir comment final affecte les comparaisons de chaînes.
L'interaction de la finalité et de l'internement
En Java, lorsqu'une chaîne est créée avec une compilation- expression constante de temps (par exemple, une chaîne littérale) et que la variable chaîne est marquée comme finale, elle devient une variable constante. Ces variables constantes sont intégrées par le compilateur, ce qui signifie que leur valeur est remplacée à l'endroit où elles sont utilisées.
Dans notre deuxième exemple de code, l'opération de concaténation devient effectivement :
String concat = "str" + "ing"; // Inlined from final variables
Il en résulte in :
String concat = "string";
La chaîne de caractères est internée, ce qui signifie qu'elle est stockée dans un pool d'instances de chaîne uniques. La même instance interne est utilisée pour tout autre littéral de chaîne avec un contenu identique.
Lorsque nous comparons concat avec "string", nous comparons en fait deux références à la même instance interne. Par conséquent, le résultat est vrai.
Le cas non final
Dans le premier exemple de code, puisque les variables de chaîne ne sont pas finales, elles ne sont pas au moment de la compilation expressions constantes. L'opération de concaténation se produit au moment de l'exécution, ce qui crée un nouvel objet String. Cet objet n'est pas interné, sa référence est donc différente de la référence internée de "string", ce qui entraîne une fausse comparaison.
Conclusion
En Java, déclarer une chaîne les variables comme finales et leur initialisation avec des expressions constantes au moment de la compilation peuvent avoir un impact sur les comparaisons de chaînes. Lorsque la chaîne est internée, comme c'est le cas pour les variables finales, des comparaisons sont effectuées sur la base de références partagées à l'instance internée unique, conduisant à des résultats potentiellement différents.
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!