Regardez, c'est un concept délicat.
Il y a une différence entre:
// These are String literals
String a = "Hiabc";
String b = "abc";
String c = "abc";
et
// These are String objects.
String a = new String("Hiabc");
String b = new String("abc");
String c = new String("abc");
Si vos cordes étaient des objets, à savoir,
String b = new String("abc");
String c = new String("abc");
Ensuite, deux objets différents auraient été créés dans le pool de chaînes à deux emplacements de mémoire différents et faisant
b == c
aurait résulté false
.
Mais depuis votre String b
et String c
sont littérales,
b == c
résultats true
. C'est parce que deux objets différents n'ont pas été créés. Et les deux a
et b
pointent vers la même chaîne dans la mémoire de la pile.
C'est la différence. Vous avez raison, ==
compare pour l'emplacement de la mémoire. Et c'est la raison,
a.substring(2, 5) == b; // a,substring(2, 5) = "abc" which is at the location of b, and
b == c // will be true, coz both b and c are literals. And their values are compared and not memory locations.
Afin d'avoir deux chaînes distinctes avec les mêmes valeurs, mais à différents endroits du String pool
et PASstack memory
, vous devez créer des objets String comme indiqué ci-dessus.
Ainsi,
a.substring(2, 5) == b; // and
b == c; // will be false. as not both are objects. Hence are stored on separate memory locations on the String pool.
vous devez utiliser
a.substring(2, 5).equals(b);
b.equals(c);
en cas d'objets.
Jetez un oeil à http://stackoverflow.com/questions/1091045/is-it-good-practice-to-use-java-lang-string-intern. Ils discutent également de ce problème. – ewernli
S'il vous plaît poster un exemple qui montre comment "cela fonctionne maintenant". –
Comme c'est drôle, j'ai inversé {string == null? "": string} - tous mes tests passés, mais quand les chaînes ont commencé à être lues depuis la base de données ... – Stephen