Quando “” == s é falso mas “” .equals (s) é verdadeiro

EDITAR Obrigado pelas respostas rápidas. Por favor, veja qual é a verdadeira questão. Eu fiz isso em negrito desta vez.

Eu entendo a diferença entre == e .equals. Então, essa não é a minha pergunta (eu realmente adicionei algum contexto para isso)

Estou realizando a validação abaixo para strings vazias:

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

Nopassado ao buscar valores do banco de dados ou desserializar objetos de outro nó, esse testefalhou, porque as duas instâncias de string eram de fato referências de objeto diferentes, embora contivessem os mesmos dados.

Então a correção para essas situações foi

if( "".equals( value ) ) {
   // which returns true for all the empty strings
}

Eu estou bem com isso. Isso é claramente entendido.

Hoje isso aconteceu mais uma vez, mas me intrigou, porque desta vez a aplicação é muito pequenaaplicação autônoma que não usarede em tudo, portanto, nenhuma nova seqüência de caracteres é obtida do banco de dados nem desserizada de outro nó.

Então a questão é:


Sob as quaisDE OUTROS circunstâncias:
"" == value // yields false 

e

"".equals( value ) // yields true

Para uma aplicação autônoma local?

Eu tenho certezanew String () não está sendo usado no código.

E a única maneira de uma referência de string ser "" é porque ela está sendo designada "" diretamente no código (ou é o que eu pensei) como em:

String a = "";
String b = a;

assert "" == b ; // this is true 

De alguma forma (depois de ler o código mais eu tenho uma pista) duas referências diferentes de objeto de string vazias foram criadas, eu gostaria de sabercomo

Mais na linha de resposta jjnguys:

Byte!

EDIT: Conclusão

Eu encontrei o motivo.

Depois da sugestão do jjnguy, pude olhar com olhos diferentes para o código.

O método culpado: StringBuilder.toString ()

Um novo objeto String é alocado e inicializado para conter a sequência de caracteres atualmente representada por este objeto.

Doh!

    StringBuilder b = new StringBuilder("h");
    b.deleteCharAt( 0 );
    System.out.println( "" == b.toString() ); // prints false

Mistério resolvido.

O código usa StringBuilder para lidar com uma string crescente. Acontece que em algum momento alguém fez:

 public void someAction( String string ) { 
      if( "" == string ) {
           return;
       }

       deleteBankAccount( string );
 }

E use

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

p.s. Eu já li muito CodingHorror ultimamente? Ou por que sinto a necessidade de adicionar algumas fotos engraçadas de animais aqui?

questionAnswers(10)

yourAnswerToTheQuestion