[Java] Äquivalenzvergleich, bei dem Anfänger beim Vergleich von Zeichenfolgen fehlschlagen. Möglicherweise sind Sie sich des Fehlers nicht einmal bewusst! ??

Wenn Sie feststellen möchten, ob zwei Zeichenfolgen gleichwertig sind, möchten Sie intuitiv == verwenden. In Java müssen Sie jedoch beim Vergleichen von Zeichenfolgen die equals-Methode anstelle von == verwenden. Um den Grund dafür zu verstehen, denke ich, dass es notwendig ist zu verstehen, dass ** Strings Objekttypen (Referenztypen) in Java und die Eigenschaften von Strings sind. ** ** **

Objekttyp (Referenztyp) Variable

Bei Objekttypen wird der "neue Operator" normalerweise verwendet, um den erforderlichen Speicherbereich aus der Klasse zuzuweisen, die die Entwurfszeichnung des Objekts ist, und um eine Instanz zu erstellen. Und in Java ist der Objekttyp ** Zeiger **. Mit anderen Worten, die Variable speichert den Adresswert des Speichers, in dem der tatsächliche Wert gespeichert ist, nicht den Wert. Int und Boolean werden übrigens als primitive Typen bezeichnet, und diese Variable enthält den Wert selbst.

String-Objekt generieren

String str = "hoge";

Normalerweise wird das Objekt im Fall eines Objekttyps mit dem "neuen Operator" erstellt, aber im Fall von "String" gibt es einen praktischen Mechanismus, der ohne Verwendung des "neuen Operators" erstellt werden kann, also "=" Es kann mit nur "" generiert werden. Durch Generieren mit =" "` können Sie auch von dem Mechanismus namens String Constant Pool profitieren, der später beschrieben wird.

String Constant Pool (Mechanismus zur Wiederverwendung von Strings)

Der String Constant Pool ist ein Mechanismus zum Speichern von Speicher beim Erstellen eines neuen String-Objekts. Der Wert wird in einem speziellen Speicherbereich gespeichert, der als String-Konstantenpool bezeichnet wird. Wenn eine neue Zeichenfolge generiert wird, wird der Pool auf denselben Inhalt des String-Objekts überprüft, und falls vorhanden, wird die Referenz wiederverwendet. Werde dir geben. Um diesen Mechanismus zu verwenden, erstellen Sie ein String-Objekt mit =" ", ohne den new operator zu verwenden. (Es gibt auch eine Möglichkeit, den "neuen Operator" explizit zu verwenden, aber ich werde ihn weglassen.)

Bei Verwendung von StringConstantPool


//Da dies das erste Mal ist, wird wie gewohnt ein Speicherbereich gesichert und generiert.
String str = "hoge";
//Eine vorhandene Referenz, da derselbe Wert bereits im String-Konstantenpool vorhanden ist(Adresswert)Verbinden mit
String str_2 = "hoge";

Wenn Sie StringConstantPool nicht verwenden


//Der Speicherbereich wird wie gewohnt gesichert und generiert
String str = new String("hoge");
//Da der String Constant Pool nicht verwendet wird, wird der Speicherbereich wie gewohnt gesichert und generiert.
String str_2 = new String("hoge");

Dies ist übrigens der Grund, warum String unveränderlich ist. Es scheint, dass es nicht möglich ist, es zu ändern, da das Ändern einer von ihnen alle anderen beeinflusst, wenn mehrere gleiche Zeichenfolgen dieselbe Referenz haben.

Es kann missverstanden werden, dass es mit == cool ist

==Fall, der cool wird mit


String str = "hoge";
String str_2 = "hoge";
//Die Bedingung dieser if-Anweisung ist wahr, aber nicht, weil die Werte gleich sind(Adresswert)Ist dasselbe.
if(str == str_2){
    System.out.println("Die Werte sind gleich");
}else{
    System.out.println("Der Wert ist unterschiedlich");
}

Da die Bedingung der if-Anweisung im obigen Code wahr ist, scheint es, dass die Werte verglichen werden können, dies ist jedoch ein Vergleich des Referenzziels (Adresswert) und des String-Konstantenpools. Es ist wahr, weil das Referenzziel (Adresswert) aufgrund der Wiederverwendung dasselbe war. Daher gilt dies in den folgenden Fällen nicht.

==Schlechter Fall


String str = "hoge";
String str_2 = new String("hoge");
//In diesem Fall wird die Referenz nicht wiederverwendet, str und str_Referenz von 2(Adresswert)Ist anders, so ist die Bedingung falsch.
if(str == str_2){
    System.out.println("Die Werte sind gleich");
}else{
    System.out.println("Der Wert ist unterschiedlich");
}

So vergleichen Sie Werte richtig

Um die Werte selbst zu vergleichen, verwenden Sie die "Gleichheitsmethode", wie am Anfang erwähnt.

String str = "hoge";
String str_2 = new String("hoge");
//Sie können die Werte selbst mit der Methode equals vergleichen.
if(str.equals(str_2)){
    System.out.println("Die Werte sind gleich");
}else{
    System.out.println("Der Wert ist unterschiedlich");
}

Zusammenfassung

Ich habe eine Methode für den richtigen String-Vergleich im Fall von Java eingeführt. Ich denke, der Punkt ist, dass der String-Typ ein Objekttyp ist und dass der Objekttyp das Referenzziel (Adresswert) anstelle des Werts enthält. Wenn Sie diese beiden verstehen, können Sie den Grund für die Verwendung der "equals-Methode" verstehen. Übrigens scheint es, dass Sie Werte mit == in relativ neuen Sprachen wie Swift und Kotlin vergleichen können.

Referenz

Recommended Posts

[Java] Äquivalenzvergleich, bei dem Anfänger beim Vergleich von Zeichenfolgen fehlschlagen. Möglicherweise sind Sie sich des Fehlers nicht einmal bewusst! ??
Die Geschichte des einfachen String-Vergleichs in Java
In Bezug auf den Vergleich der Zeichenfolgentypäquivalenz in Java
Fassen Sie den Lebenszyklus von Java-Objekten zusammen, die bei der Android-Entwicklung berücksichtigt werden müssen
Spüren Sie den Lauf der Zeit auch in Java
Dinge, die Sie beim Schreiben von Code in Java beachten sollten
[Rails] Bei der Beschreibung der Validierung ist Vorsicht geboten
Die Geschichte, das Verhalten von String durch Passieren von Java nicht zu kennen
[Java] Geschwindigkeitsvergleich der Zeichenfolgenkombination
[Java] Korrekter Vergleich des String-Typs
Finden Sie das Maximum und Minimum der fünf in Java eingegebenen Zahlen
Die Geschichte, dass das Servlet nicht in die Java-Webanwendung geladen werden konnte
[Java] [Microsoft] Beachten Sie Folgendes, wenn Sie den SQL Server-JDBC-Treiber in eine JAR-Datei aufnehmen