EDIT Gracias por la pronta respuesta. Por favor mira cuál es la verdadera pregunta. Lo hice audaz esta vez.Cuando "" == s es falso pero "" .equals (s) es verdadero
Entiendo la diferencia entre == y .equals. Por lo tanto, no es mi pregunta (que en realidad añadido un poco de contexto para que)
que estoy realizando la validación abajo para cadenas vacías:
if("" == value) {
// is empty string
}
En los últimos valores cuando ir a buscar desde el db o deserializar objetos de otro nodo, esta prueba falló, porque las dos instancias de cadena eran de hecho referencias de objetos diferentes, aunque contenían los mismos datos.
Así que la solución para esas situaciones era
if("".equals(value)) {
// which returns true for all the empty strings
}
estoy bien con eso. Eso está claramente entendido.
Hoy en día esto ocurrió una vez más, pero me desconcertó porque la aplicación de este tiempo es una muy pequeña aplicación independiente que no utiliza red en todo, así que no hay nueva cadena se obtiene de la base de datos ni de deserizalized otro nodo
Así que la pregunta es:
Bajo qué circunstancias OTROS:
"" == value // yields false
y
"".equals(value) // yields true
Para una aplicación independiente local?
Estoy bastante seguro de que nuevo String() no se está utilizando en el código.
Y la única forma en que una cadena de referencia podría ser "" se debe a que se está asignando "" directamente en el código (o eso es lo que pensaba) como en:
String a = "";
String b = a;
assert "" == b ; // this is true
De alguna manera (después de leer el código más tengo una pista fueron creados) dos referencias a objetos cadena vacía diferentes, me gustaría saber cómo
más en la línea de respuesta jjnguys:
Byte!
EDIT: Conclusión
he encontrado la razón.
Después de la sugerencia de jjnguy pude ver con otros ojos el código.
El método culpable: StringBuilder.toString()
A new String object is allocated and initialized to contain the character sequence currently represented by this object.
Doh ...
StringBuilder b = new StringBuilder("h");
b.deleteCharAt(0);
System.out.println("" == b.toString()); // prints false
Misterio resuelto.
El código utiliza StringBuilder para tratar con una cadena cada vez mayor. Resulta que en algún momento alguien lo hizo:
public void someAction(String string) {
if("" == string) {
return;
}
deleteBankAccount(string);
}
y utilizar
someAction(myBuilder.toString()); // bug introduced.
P. S. ¿He leído demasiado CodingHorror últimamente? ¿O por qué siento la necesidad de agregar algunas imágenes divertidas de animales aquí?
if (value! = Null && value.length == 0) {...}, y debe usar equals porque == para objetos compara referencias, es decir, son el mismo objeto. Mientras que en tiempo de compilación Java encuentra cadenas idénticas y les hace compartir la misma referencia (las cadenas son inmutables), en tiempo de ejecución es fácil crear cadenas vacías que tienen referencias diferentes. – JeeBee
Como mi respuesta sugiere ... olvida lo que "pensaste". Si quiere comprobar si algo tiene el mismo valor que la cadena vacía, utilice iguales. Estás tratando de depender del compilador que intercede en tus cadenas, lo cual Josh Bloch señala que no es una herramienta para programadores :-). Vea abajo. – Tom
Varias respuestas ahora muestran manipulaciones de cadena simples que producen diferentes objetos String de longitud cero. Las redes y la bondad no tienen nada que ver con esas respuestas. – djna