Wenn "" == s ist falsch aber "" .equals (s) ist wahr

BEARBEITEN
Vielen Dank für die prompte Antworten. Bitte sehen, was die eigentliche Frage ist. Ich habe es Fett dieser Zeit.

Ich verstehe den Unterschied zwischen == und .entspricht. So, das ist nicht meine Frage (ich habe tatsächlich einige zusätzliche Kontext für das)


Ich bin der Durchführung der Validierung unten für leere Saiten:

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

In der Vergangenheit beim abrufen der Werte aus der db oder Deserialisieren von Objekten von einem anderen Knoten, dieser test fehlgeschlagenweil die beiden string-Instanzen waren in der Tat andere Objekt verweist, wenn auch Sie enthalten die gleichen Daten.

So das Update für diese Situationen wurde

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

Ich bin gut mit, dass. Das ist klar zu verstehen.

Heute passierte dies wieder, aber es verwirrt mich, weil in dieser Zeit der Anwendung ist eine sehr kleine standalone-Anwendungder nicht Netzwerk überhauptso dass keine neue string aus der Datenbank abgerufen, noch deserizalized von einem anderen Knoten.

Also die Frage ist:

 

Unter denen ANDEREN Umstände:

"" == value //yields false 

und

"".equals( value ) //yields true

Für eine lokale standalone-Anwendung?

Ich bin mir ziemlich sicher, dass new String() ist nicht im code verwendet.

Und die einzige Möglichkeit, eine string-Referenz werden könnte "" ist, weil es wird zugewiesen "" direkt in den code (oder das, was ich dachte), wie in:

String a = "";
String b = a;

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

Irgendwie (nach dem Lesen der code mehr habe ich eine Ahnung) zwei verschiedene leere string-Objekt-Referenzen erstellt wurden, würde ich gerne wissen, wie

Mehr in der Linie der jjnguys Antwort:

Byte!

EDIT: Fazit

Habe ich den Grund gefunden.

Nach jjnguy Vorschlag, den ich war in der Lage zu schauen mit anderen Augen auf den code.

Schuldig-Methode: die Klasse StringBuilder.toString()

Ein neues String-Objekt zugewiesen und initialisiert, enthalten die Zeichenfolge, die derzeit vertreten durch das Objekt.

Doh!...

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

Rätsel gelöst.

Den code verwendet StringBuilder umgehen mit einer stetig wachsenden string. Es stellt sich heraus, dass irgendwann jemand:

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

       deleteBankAccount( string );
 }

und verwenden

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

p.s. Ich lese auch viel CodingHorror in letzter Zeit? Oder warum fühle ich das Bedürfnis, fügen Sie einige lustige Tier Bilder hier?

InformationsquelleAutor der Frage OscarRyz | 2009-07-10

Schreibe einen Kommentar