Cuando “” == s es falso pero “” .equals (s) es verdadero

EDITAR Gracias por la pronta respuesta. Por favor, ver cuál es la verdadera pregunta. Lo he hecho audaz esta vez.

Entiendo la diferencia entre == y .equals. Entonces, esa no es mi pregunta (en realidad agregué algo de contexto para eso)

Estoy realizando la validación a continuación para cadenas vacías:

if( "" == value ) { 
    // is empty string 
} 

En elpasado al obtener valores de la base de datos o deserializar objetos de otro nodo, esta pruebaha fallado, porque las dos instancias de cadena eran, de hecho, referencias de objeto 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 se entiende claramente.

Hoy esto sucedió una vez más, pero me desconcertó porque esta vez la aplicación es muy pequeña.aplicación independiente eso no usared en absoluto, por lo que no se obtiene una nueva cadena desde la base de datos ni se deseriza desde otro nodo.

Así que la pregunta es:


Bajo la cualOTRO circunstancias:
"" == value // yields false 

y

"".equals( value ) // yields true

¿Para una aplicación local independiente?

Estoy bastante seguronueva cadena () no se está utilizando en el código.

Y la única forma en que una referencia de cadena podría ser "" es porque se está asignando "" directamente en el código (o eso es lo que pensé), 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) se crearon dos referencias de objeto de cadena vacía diferentes, me gustaría sabercómo

Más en la línea de respuesta jjnguys:

¡Byte!

EDITAR: Conclusión

He encontrado la razón.

Después de la sugerencia de jjnguy pude ver el código con diferentes ojos.

El método culpable: StringBuilder.toString ()

Un nuevo objeto String se asigna y se inicializa para contener la secuencia de caracteres actualmente representada por este objeto.

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 use

 someAction( myBuilder.toString() ); // bug introduced. 

PD. ¿He leído demasiado CodingHorror últimamente? ¿O por qué siento la necesidad de agregar algunas fotos divertidas de animales aquí?

Respuestas a la pregunta(10)

Su respuesta a la pregunta