Gdy „” == s jest fałszywe, ale „”) są prawdziwe

EDYTOWAĆ Dzięki za szybkie odpowiedzi. Zobacz, jakie jest prawdziwe pytanie. Tym razem odważyłem się.

Rozumiem różnicę między == i .equals. To nie jest moje pytanie (właściwie dodałem do tego jakiś kontekst)

Wykonuję poniższe sprawdzanie poprawności pustych ciągów:

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

wprzeszłość podczas pobierania wartości z bazy danych lub deserializacji obiektów z innego węzła, ten testnie powiodło się, ponieważ dwie instancje łańcuchowe były rzeczywiście różnymi odwołaniami do obiektów, chociaż zawierały te same dane.

Rozwiązaniem dla tych sytuacji było

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

Pasuje mi to. To jest zrozumiałe.

Dzisiaj stało się to jeszcze raz, ale mnie to zdziwiło, ponieważ tym razem aplikacja jest bardzo małasamodzielna aplikacja to nie używasieć w ogóle, więc żaden nowy ciąg nie jest pobierany z bazy danych ani nie jest skanalizowany z innego węzła.

Więc pytanie brzmi:


Pod którymINNY okoliczności:
"" == value // yields false 

i

"".equals( value ) // yields true

W przypadku lokalnej aplikacji autonomicznej?

jestem prawie pewiennew String () nie jest używany w kodzie.

Jedynym sposobem, w jaki może być odniesienie do ciągu znaków, jest „”, ponieważ jest on przypisywany „” bezpośrednio w kodzie (lub tak mi się wydawało), jak w:

String a = "";
String b = a;

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

Jakoś (po przeczytaniu kodu mam więcej wskazówek) powstały dwa różne odwołania do pustych obiektów, chciałbym to wiedziećw jaki sposób

Więcej w linii odpowiedzi jjnguys:

Bajt!

EDIT: Wniosek

Znalazłem powód.

Po jjnguy sugestii byłem w stanie spojrzeć innym okiem na kod.

Metoda winna: StringBuilder.toString ()

Nowy obiekt String jest przydzielany i inicjowany, aby zawierał sekwencję znaków aktualnie reprezentowaną przez ten obiekt.

Doh! ...

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

Zagadka rozwiązana.

Kod wykorzystuje StringBuilder do radzenia sobie z coraz większym ciągiem znaków. Okazuje się, że w pewnym momencie ktoś:

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

       deleteBankAccount( string );
 }

I użyć

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

p.s. Czy ostatnio czytałem za dużo CodingHorror? A może czuję potrzebę dodania tutaj śmiesznych zdjęć zwierząt?

questionAnswers(10)

yourAnswerToTheQuestion