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:
"" == 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?