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?

105voto

coobird Punkte 155882

== vergleicht Objektreferenzen in Java und das ist keine Ausnahme für String Objekte.

Für den Vergleich des tatsächlichen Inhalts von Objekten (einschließlich String ), muss man die equals Methode .

Wenn ein Vergleich zwischen zwei String Objekte mit == entpuppt sich als true Das liegt daran, dass die String Objekte interniert wurden und die Java Virtual Machine mehrere Verweise auf dieselbe Instanz von String . Man sollte nicht erwarten, dass der Vergleich einer String Objekt, das denselben Inhalt wie ein anderes String Objekt mit == zu bewerten als true .

102voto

Matt Razza Punkte 3428

.equals() vergleicht die Daten in einer Klasse (vorausgesetzt, die Funktion ist implementiert). == vergleicht Zeigerpositionen (Position des Objekts im Speicher).

== gibt true zurück, wenn beide Objekte (NOT TALKING ABOUT PRIMITIVES) auf die GLEICHE Objektinstanz zeigen. .equals() gibt true zurück, wenn die beiden Objekte dieselben Daten enthalten equals() Versus == in Java

Das könnte Ihnen helfen.

101voto

icza Punkte 335148

== führt eine Referenz Gleichheitsprüfung, ob sich die 2 Objekte (in diesem Fall Zeichenketten) auf das gleiche Objekt im Speicher beziehen.

Le site equals() Methode prüft, ob die Inhalt oder die Staaten von 2 Objekten identisch sind.

Offensichtlich == ist schneller, kann aber in vielen Fällen falsche Ergebnisse liefern, wenn man nur feststellen will, ob 2 String s enthalten den gleichen Text.

Eindeutig die Verwendung des equals() Methode wird empfohlen.

Machen Sie sich keine Sorgen über die Leistung. Einige Dinge, die zur Verwendung ermutigen String.equals() :

  1. Durchführung von String.equals() prüft zunächst die Referenzgleichheit (mit == ), und wenn die 2 Zeichenketten durch Referenz gleich sind, wird keine weitere Berechnung durchgeführt!
  2. Wenn die 2 String-Referenzen nicht gleich sind, String.equals() prüft als nächstes die Länge der Zeichenketten. Auch dies ist ein schneller Vorgang, da die String Klasse speichert die Länge der Zeichenkette, ohne dass die Zeichen oder Codepunkte gezählt werden müssen. Wenn die Längen unterschiedlich sind, wird keine weitere Prüfung durchgeführt, wir wissen, dass sie nicht gleich sein können.
  3. Nur wenn wir so weit gekommen sind, wird der Inhalt der beiden Zeichenketten tatsächlich verglichen, und dies ist ein Kurzzeitvergleich: nicht alle Zeichen werden verglichen, wenn wir ein nicht übereinstimmendes Zeichen (an der gleichen Stelle in den beiden Zeichenketten) finden, werden keine weiteren Zeichen überprüft.

Selbst wenn wir die Garantie haben, dass die Zeichenketten Interna sind, kann die Verwendung der equals() Methode ist immer noch nicht so aufwändig, wie man denken könnte, und definitiv der empfohlene Weg. Wenn Sie eine effiziente Referenzprüfung wünschen, verwenden Sie Enums, bei denen durch die Sprachspezifikation und -implementierung garantiert ist, dass derselbe Enum-Wert dasselbe Objekt ist (per Referenz).

84voto

Mohamed E. ManSour Punkte 1061

Wenn es Ihnen wie mir geht: Als ich anfing, Java zu benutzen, wollte ich den Operator "==" verwenden, um zu testen, ob zwei String-Instanzen gleich sind, aber das ist in Java wohl oder übel nicht der richtige Weg.

In diesem Tutorial zeige ich verschiedene Möglichkeiten, Java-Strings korrekt zu vergleichen, beginnend mit dem Ansatz, den ich am häufigsten verwende. Am Ende dieses Java-String-Vergleichstutorials werde ich auch erörtern, warum der Operator "==" beim Vergleich von Java-Strings nicht funktioniert.

Option 1: Java String-Vergleich mit der equals-Methode Die meiste Zeit (vielleicht 95 % der Zeit) vergleiche ich Strings mit der Methode equals der Java String-Klasse, etwa so:

if (string1.equals(string2))

Diese String equals-Methode betrachtet die beiden Java-Strings, und wenn sie genau die gleiche Zeichenfolge enthalten, werden sie als gleich angesehen.

Betrachtet man ein kurzes Beispiel für einen String-Vergleich mit der equals-Methode, so würde der folgende Test die beiden Strings nicht als gleich einstufen, da die Zeichen nicht exakt gleich sind (die Groß- und Kleinschreibung der Zeichen ist unterschiedlich):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

Wenn die beiden Zeichenketten jedoch genau dieselbe Zeichenfolge enthalten, gibt die equals-Methode true zurück, wie in diesem Beispiel:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Option 2: String-Vergleich mit der Methode equalsIgnoreCase

Bei einigen Vergleichstests für Zeichenketten wird nicht berücksichtigt, ob die Zeichenketten groß oder klein geschrieben sind. Wenn Sie Ihre Zeichenketten auf diese Weise auf Gleichheit prüfen möchten, verwenden Sie die equalsIgnoreCase-Methode der String-Klasse, etwa so:

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

Option 3: Java String-Vergleich mit der compareTo-Methode

Es gibt noch eine dritte, weniger verbreitete Möglichkeit, Java-Strings zu vergleichen, und zwar mit der Methode compareTo der Klasse String. Wenn die beiden Strings genau gleich sind, gibt die compareTo-Methode den Wert 0 (Null) zurück. Hier ein kurzes Beispiel dafür, wie dieser String-Vergleich aussieht:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Während ich über das Konzept der Gleichheit in Java schreibe, ist es wichtig zu wissen, dass die Sprache Java eine Gleichheitsmethode in der Basisklasse Java Object enthält. Wenn Sie Ihre eigenen Objekte erstellen und feststellen wollen, ob zwei Instanzen Ihres Objekts "gleich" sind, sollten Sie diese equals-Methode in Ihrer Klasse außer Kraft setzen (und implementieren) (so wie die Java-Sprache dieses Gleichheits-/Vergleichsverhalten in der String equals-Methode bereitstellt).

Das sollten Sie sich ansehen \==, .equals(), compareTo(), und compare()

80voto

Aniket Thakur Punkte 62911

Le site == Operator prüft, ob die beiden Referenzen auf dasselbe Objekt verweisen oder nicht. .equals() auf den tatsächlichen Inhalt der Zeichenkette (Wert) prüfen.

Beachten Sie, dass die .equals() Methode gehört zur Klasse Object (Oberklasse aller Klassen). Sie müssen es nach Ihren Klassenanforderungen überschreiben, aber für String ist es bereits implementiert, und es prüft, ob zwei Strings den gleichen Wert haben oder nicht.

  • Fall 1

    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true

    Grund: String-Literale, die ohne Null erstellt werden, werden im String-Pool im permgen-Bereich des Heaps gespeichert. Daher verweisen sowohl s1 als auch s2 auf dasselbe Objekt im Pool.

  • Fall 2

    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true

    Grund: Wenn Sie ein String-Objekt mit der Methode new Schlüsselwort wird ihm ein eigener Platz auf dem Heap zugewiesen.

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