Wenn “” == s falsch ist, aber “” .equals (s) wahr ist

BEARBEITEN Danke für die prompten Antworten. Bitte sehen Sie, was die eigentliche Frage ist. Ich habe es dieses Mal fett gemacht.

Ich verstehe den Unterschied zwischen == und .equals. Also, das ist nicht meine Frage (ich habe tatsächlich einen Kontext hinzugefügt)

Ich führe die folgende Überprüfung für leere Zeichenfolgen durch:

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

In demVergangenheit Wenn Sie Werte aus der Datenbank abrufen oder Objekte von einem anderen Knoten deserialisieren, wird dieser Test durchgeführtgescheitert, weil die beiden String-Instanzen in der Tat unterschiedliche Objektreferenzen waren, obwohl sie dieselben Daten enthielten.

Die Lösung für diese Situationen war also

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

Ich bin damit zufrieden. Das ist klar verstanden.

Heute ist das noch einmal passiert, aber es hat mich verwirrt, weil die Anwendung diesmal sehr klein istEigenständige Anwendung das nutzt nichtNetzwerk überhauptDaher wird keine neue Zeichenfolge aus der Datenbank abgerufen oder von einem anderen Knoten deserisiert.

Die Frage ist also:


Unter welchenANDERE Umstände:
"" == value // yields false 

und

"".equals( value ) // yields true

Für eine lokale Standalone-Anwendung?

Ich bin mir ziemlich sicherneuer String () wird im Code nicht verwendet.

Und der einzige Weg, wie ein Stringverweis "" sein könnte, ist, dass er direkt im Code zugewiesen wird (oder wie ich dachte):

String a = "";
String b = a;

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

Irgendwie (nachdem ich den Code mehr gelesen habe, habe ich eine Ahnung) wurden zwei verschiedene leere String-Objektreferenzen erstellt, würde ich gerne wissenWie

Mehr in der Zeile von jjnguys Antwort:

Byte!

EDIT: Fazit

Ich habe den Grund gefunden.

Nach jjnguy Vorschlag konnte ich mit anderen Augen auf den Code schauen.

Die schuldige Methode: StringBuilder.toString ()

Ein neues String-Objekt wird zugewiesen und initialisiert, um die aktuell von diesem Objekt dargestellte Zeichenfolge zu enthalten.

Doh! ...

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

Geheimnis gelüftet.

Der Code verwendet StringBuilder, um mit einer ständig wachsenden Zeichenfolge umzugehen. Es stellt sich heraus, dass irgendwann jemand Folgendes getan hat:

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

       deleteBankAccount( string );
 }

und verwenden

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

p.s. Habe ich in letzter Zeit zu viel CodingHorror gelesen? Oder warum muss ich hier lustige Tierbilder einfügen?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage