Il est à cause d'une optimisation de la mémoire réalisée par le compilateur ... à savoir String
constantes (ie - String
s faites par le même String
littéral) utilisent le même objet String
depuis Strings
sont immuables. L'opérateur ==
vérifie simplement que deux objets sont le même objet réel.
Si vous pouvez vous procurer le livre Java Puzzlers de Joshua Bloch et Neal Gafter, et regardez le puzzle 13, "Animal Farm" ... il a de bons conseils sur cette question. Je vais copier un texte pertinent:
« Vous savez sans doute que les constantes à la compilation de type String
sont internées [JLS 15,28] En d'autres termes, les deux expressions constantes de type String
qui désignent la même séquence de caractères sont. représenté par des références d'objet identiques ...Votre code devrait rarement, voire jamais, dépendre de l'internement des constantes de chaîne. Interning a été conçu uniquement pour réduire l'empreinte mémoire de la machine virtuelle, pas comme outil pour les programmeurs ... Lorsque vous comparez des références d'objet, vous devez utiliser la méthode equals
plutôt que l'opérateur ==
sauf si vous devez comparer l'identité de l'objet plutôt que sa valeur .. »
C'est de la référence ci-dessus ... je l'ai mentionné pages 30 -. 31 dans mon livre
Pour plus d'informations sur le pool de chaînes, jetez un oeil à wikipedia: http://en.wikipedia.org/wiki/String_interning (+1 même idée) –
Oui, les littéraux de chaîne sont automatiquement internés, conformément à la méthode interne API - http : //java.sun.com/javase/6/docs/api/java/lang/String.html – Ash
Ce ne sont pas seulement les littéraux qui sont internés, mais aussi les constantes de compilation. –