[Java] Korrekter Vergleich des String-Typs

Lassen Sie uns tief in den String-Typ-Vergleich eintauchen

Organisierte den Vergleich von String-Typ-Werten.

Gleiche Vergleichsmethode

  1. == -Für primitive Typen vergleichen Sie die Werte. -Im Objekttyp werden die Referenzwerte der Objekte verglichen, um festzustellen, ob die Objekte gleich sind.

  2. equals() Es kann nur im Objekttyp verwendet werden, und der Inhalt der Objekte wird verglichen, um festzustellen, ob die Objekte denselben Wert haben.

Mit anderen Worten, der Typ Strng ist ein Referenztypobjekt, sodass Sie gleich verwenden können.

Überprüfung (Ist es wirklich unmöglich, mit == zu vergleichen)

StringSample.java


    String str1 = "A";
    String str2 = "A";
    String str3 = new String("A");
    System.out.println(str1.hashCode());
    System.out.println(str2.hashCode());
    if(str1 == str2) {
        System.out.println("TRUE");
    }else {
        System.out.println("FALSE");
    }
    if(str1 == str3) {
        System.out.println("TRUE");
    }else {
        System.out.println("FALSE");
    }

Ergebnis

100
100
TRUE

Es wurde WAHR. Ist es in Ordnung, den String-Typ mit == zu vergleichen?

Umfrage

Der String-Typ erstellt bei der Initialisierung einen Wert im Heap-Bereich, der jedoch anscheinend wiederverwendet wird, wenn derselbe Wert verwendet wird.

Ich habe versucht zu illustrieren

String比較.png

Verwenden Sie zum Speichern von Speicher den Bereich (Adresse = 100), in dem der Wert "A" ohne Neu übereinstimmt.

Verhalten, wenn der Wert von String geändert wird

String比較2.png

Wenn Sie den Wert der Variablen neu schreiben, wird der Referenzquellenwert (Adresse = 100) nicht geändert, aber das Referenzziel wird geändert, indem der neue Bereich von "B" neu erstellt wird. (Die Referenzadresse wurde von 100 auf 200 geändert.)

Was ist das String-Objekt gleich zu tun

String.class


    private final char value[];

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;                //Wert des eigenen Objekts
                char v2[] = anotherString.value;  //Wert des verglichenen Objekts
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])           //Zerlegen Sie String in char und vergleichen Sie Werte
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

Das String-Objekt wird in char [] zerlegt und die Werte werden einzeln verglichen.

Fazit

Zeichenfolgenobjekte können für verschiedene lokale Variablen denselben Referenzwert (Referenzadresse) haben, wenn sie denselben Wert zum Speichern von Speicher haben. Dies ist jedoch nicht garantiert und sollte mit gleich verglichen werden.

Recommended Posts

[Java] Korrekter Vergleich des String-Typs
[Java] Geschwindigkeitsvergleich der Zeichenfolgenkombination
In Bezug auf den Vergleich der Zeichenfolgentypäquivalenz in Java
[Java] Vergleich von Zeichenketten und && und ||
Die Geschichte des einfachen String-Vergleichs in Java
[Java] Vergleich der Geschwindigkeit der Typkonvertierung
[Null-Sicherheit] Kotlin Java-Vergleichsnotiz Richtige Verwendung der Null-Sicherheit
Verschiedene Methoden der Java String Klasse
Java-Zeichenfolge
Initialisierung mit einer leeren Zeichenfolge für eine Instanz vom Typ Java-Zeichenfolge
[Java] Implizite Typumwandlung (AOJ10-Summe von Zahlen)
Konvertierung des Java-Datumsdatentyps (Datum, Kalender, Zeichenfolge)
[Java] Spickzettel für Datentyp / Zeichenkettenklasse
[Java] Konvertiert Null vom Objekttyp in String-Typ
[Java / Swift] Vergleich von Java-Schnittstelle und Swift-Protokoll
[Grundkenntnisse in Java] Informationen zur Typkonvertierung
Java Zusammenfassung der häufig gesuchten Typkonvertierungen
Java 8 LocalDateTime-Typkonvertierung (String, java.util.Date)
Typkonvertierung vom Java Big Decimal-Typ zum String-Typ
[Java] Auffüllen von Zeichenfolgen
MyBatis-Zeichenfolgenvergleich
[Java] Aufzählungstyp
Java Optionaler Typ
Java-Doppeltyp
[Java] Kartenvergleich
Java-String-Verarbeitung
Java Framework Vergleich
Geteilter String (Java)
[Java] Übersicht über Java
[Java] Ermittelt die Länge der Ersatzpaarzeichenfolge
[Java] Der verwirrende Teil von String und StringBuilder
[Java] Achten Sie auf den Schlüsseltyp der Karte
Java-Typkonvertierung (String, int, Datum, Kalender usw.)
Warum der Klassenvergleich vom Typ Java String (==) nicht verwendet werden kann
Java-Überprüfung ③ (grundlegende Verwendung von Arrays / Referenztyp)
Abgelaufene Java-Sammlung
Voraussichtliche Funktionen von Java
[Java] Bedeutung von Public static void main (String [] args)
NIO.2 Überprüfung von Java
Vergleich der Java-Versionsnotation
[Java] Vergleich der Ausführungsgeschwindigkeit des String-Joins (+ Operator vs StringBuilder)
[Java] Datentyp ①-Basistyp
Mehrfacher Ersatz für Java-Zeichenfolgen
[java.io] Zusammenfassung der Java-String-Eingabe (InputStream, Reader, Scanner)
[Java, Kotlin] Typabweichung
Feld für den Java-Klassentyp
Geschichte der Java-Annotationen
[Hinweis] Java: Zeichenfolgensuche
Typbestimmung in Java
Java # 1 studieren (typischer Typ)
[Hinweis] Java: Zeichenkettenübersicht
Java (Verdienste des Polymorphismus)
[Java] Über Objects.equals () und Überprüfung des String-Vergleichs (== und gleich)
Informationen zur Java String-Klasse
Ich war süchtig nach getXxxx von ResultSet, weil es ein primitiver Typ ist (Java)
[Java] Verboten, eine Art von Alphabet zu verwenden FizzBuzz [Bindung]
NIO Bewertung von Java
Äquivalenter Vergleich von Java-Wrapper-Klasse und primitivem Typ