Mira, este es un concepto difícil.
Hay una diferencia entre:
// These are String literals
String a = "Hiabc";
String b = "abc";
String c = "abc";
y
// These are String objects.
String a = new String("Hiabc");
String b = new String("abc");
String c = new String("abc");
Si sus cuerdas eran objetos, es decir,
String b = new String("abc");
String c = new String("abc");
Entonces, dos objetos diferentes habrían sido creada en el conjunto de cadenas en dos ubicaciones de memoria diferentes y haciendo
b == c
habría resultado false
.
Pero desde sus String b
y String c
son literales,
b == c
resultados true
. Esto se debe a que no se crearon dos objetos diferentes. Y tanto a
como b
apuntan a la misma Cadena en la memoria de la pila.
Esta es la diferencia. Tienes razón, ==
se compara para la ubicación de la memoria. Y esa es la razón,
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.
Con el fin de tener dos cadenas separadas con los mismos valores pero en diferentes lugares de la String pool
y NOstack memory
, es necesario crear objetos String como se muestra arriba.
Así,
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.
que tienen que utilizar
a.substring(2, 5).equals(b);
b.equals(c);
en el caso de los objetos.
Eche un vistazo a http://stackoverflow.com/questions/1091045/is-it-good-practice-to-use-java-lang-string-intern. También discuten este tema. – ewernli
Por favor, publique un ejemplo que muestre cómo "esto funciona ahora". –
¡Qué gracioso salió esto! Estaba invirtiendo {string == null? "": cadena} - todas mis pruebas pasaron, pero cuando las cadenas comenzaron a leerse en la base de datos ... – Stephen