Maison >Java >javaDidacticiel >La déclaration de chaînes comme « finales » en Java affecte-t-elle les comparaisons « == » ?

La déclaration de chaînes comme « finales » en Java affecte-t-elle les comparaisons « == » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-03 06:12:10601parcourir

Does Declaring Strings as `final` in Java Affect `==` Comparisons?

Comparaison de chaînes avec == déclaré comme final en Java

Lors de la comparaison de chaînes à l'aide de l'opérateur d'égalité (==) en Java, le résultat peut différer selon que les chaînes sont déclarées comme finales.

Final Chaînes

Lorsqu'une chaîne est déclarée comme finale, le compilateur l'optimise en insérant la valeur en tant qu'expression constante de compilation. Cela signifie que la valeur de la chaîne est déterminée au moment de la compilation et stockée directement dans le bytecode, plutôt que d'être allouée dynamiquement au moment de l'exécution.

Comportement des chaînes finales

Dans le cas de chaînes déclarées comme finales, l'expression de comparaison concat == "string" renvoie true car :

  • Le compilateur remplace le opération de concaténation avec la chaîne en ligne : String concat = "str" ​​"ing" ; // devient String concat = "string";
  • Les littéraux de chaîne sont internés, ce qui signifie que plusieurs références à la même valeur de chaîne partagent la même instance. Par conséquent, concat et la « chaîne » littérale font référence au même objet String, ce qui donne une véritable égalité.

Chaînes non finales

En revanche, non -les chaînes finales ne sont pas intégrées et sont allouées dynamiquement au moment de l'exécution. L'opération de concaténation crée un nouvel objet String, différent de la « chaîne » littérale en mémoire. Par conséquent, l'expression de comparaison concat == "string" renvoie false.

Vérification

Pour confirmer ce comportement, on peut comparer le bytecode du non final et du final versions de chaînes :

Non-finale Version :

// stores str and ing in separate variables and uses StringBuilder for concatenation

Version finale :

// directly inlines the final variable to create String string at compile time

Par conséquent, déclarer des chaînes comme finales et les initialiser avec des expressions constantes au moment de la compilation peut affecter le résultat des comparaisons d'égalité utilisant == en raison de l'inline et de l'internement des littéraux de chaîne.

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!

Déclaration:
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