723 Stimmen

Wie kann ich in Java Zeichenketten vergleichen?

Ich habe die == Operator in meinem Programm, um alle meine bisherigen Zeichenketten zu vergleichen. Allerdings bin ich auf einen Fehler gestoßen und habe eine davon in .equals() und der Fehler wurde dadurch behoben.

Es == schlecht? Wann sollte sie verwendet werden und wann nicht? Worin besteht der Unterschied?

153voto

duffymo Punkte 298898
String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Vergewissern Sie sich, dass Sie verstehen, warum. Es liegt daran, dass die == Vergleich vergleicht nur Referenzen; der equals() Methode führt einen zeichenweisen Vergleich des Inhalts durch.

Wenn Sie neu anrufen für a y b erhält jeder eine neue Referenz, die auf den "foo" in der Stringtabelle. Die Verweise sind unterschiedlich, aber der Inhalt ist derselbe.

130voto

Uri Punkte 86472

Ja, es ist schlimm...

== bedeutet, dass Ihre beiden String-Referenzen genau das gleiche Objekt sind. Sie haben vielleicht gehört, dass dies der Fall ist, weil Java eine Art Literal-Tabelle führt (was es auch tut), aber das ist nicht immer der Fall. Einige Zeichenketten werden auf unterschiedliche Weise geladen, aus anderen Zeichenketten zusammengesetzt usw., so dass Sie niemals davon ausgehen dürfen, dass zwei identische Zeichenketten am selben Ort gespeichert sind.

Equals führt den eigentlichen Vergleich für Sie durch.

128voto

cletus Punkte 596503

Ja, == ist schlecht für den Vergleich von Strings (eigentlich alle Objekte, es sei denn, Sie wissen, dass sie kanonisch sind). == vergleicht lediglich Objektreferenzen. .equals() Tests auf Gleichheit. Bei Strings sind sie oft gleich, aber wie Sie festgestellt haben, ist das nicht immer garantiert.

124voto

Saurabh Agarwal Punkte 323

Java verfügt über einen String-Pool, unter dem Java die Speicherzuweisung für die String-Objekte verwaltet. Siehe String-Pools in Java

Wenn Sie zwei Objekte mit der Funktion == Operator vergleicht er die Adressgleichheit mit dem String-Pool. Wenn die beiden String-Objekte die gleichen Adressreferenzen haben, gibt er true sonst false . Wenn Sie jedoch den Inhalt von zwei String-Objekten vergleichen wollen, müssen Sie die Funktion equals Methode.

equals ist eigentlich eine Methode der Klasse Object, aber sie wird in der Klasse String überschrieben und es wird eine neue Definition gegeben, die den Inhalt von Object vergleicht.

Example:
    stringObjectOne.equals(stringObjectTwo);

Aber achten Sie auf den Fall von String. Wenn Sie einen Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung wünschen, müssen Sie die Methode equalsIgnoreCase der Klasse String verwenden.

Schauen wir mal:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

107voto

pgras Punkte 12434

Ich stimme der Antwort von zacherates zu.

Was Sie jedoch tun können, ist den Aufruf intern() für Ihre nicht-literalen Zeichenfolgen.

Von zacherates Beispiel:

// ... but they are not the same object
new String("test") == "test" ==> false 

Wenn Sie intern die nicht-literale String-Gleichheit ist true :

new String("test").intern() == "test" ==> true

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X