[JAVA] Unterschied zwischen == Operator und Methode gleich

Bei der Arbeit fragte mich ein junger Mann: "Warum verwenden Sie" gleich "anstelle von" == "(zu diesem Zeitpunkt in String) und beiläufig" Objekte vergleichen, indem Sie Werte in der Methode gleich vergleichen ". Es ist der Körper. " Um ehrlich zu sein, habe ich es jedoch nur als Zakuri verstanden, also bin ich zum Anfang zurückgekehrt und habe einige Nachforschungen angestellt. Da ich wieder am Anfang bin, werde ich über die offensichtliche Geschichte sprechen. Und bitte weisen Sie auf Fehler hin.

Primitive und Referenztypen

Zunächst wird Java grob in primitive Typen und Referenztypen unterteilt. Primitive Typen speichern hauptsächlich Daten und haben keine Methoden. Daher wird es auch als Basisdatentyp bezeichnet. Wenn Sie einen Wert vom primitiven Typ erstellen, wird der Wert direkt in den Speicher geschrieben. Es gibt die folgenden acht primitiven Typen.

Sie können sich primitive Typen so vorstellen, dass sie mit Kleinbuchstaben beginnen. Alle anderen Typen, die mit Großbuchstaben beginnen, einschließlich des String-Typs, sind Referenztypen. Für den Referenztyp wird die Adresse des Objekts, auf das verwiesen wird, in den Speicher geschrieben. Jetzt möchte ich diese vergleichen.

== Operator

Vergleichen wir den primitiven Typ und den Referenztyp mithilfe von int und Integer mit dem Operator "==".

//Primitiver Typvergleich
int intA = 1;
int intB = 1;
System.out.println(intA == intB); // ture

//Referenztypvergleich
Integer integerA = new Integer(1);
Integer integerB = new Integer(1);
System.out.println(integerA == integerB); // false

Es scheint, dass die Werte im primitiven Typ verglichen werden. Es scheint, dass die Werte im Referenztyp nicht verglichen werden, und obwohl integerA und integerB gleich 1 sein sollten, werden sie als false verarbeitet. Dies liegt daran, dass nicht die in Integer enthaltenen Werte verglichen werden, sondern die referenzierten Instanzen von Integer A und Integer B verglichen werden, um festzustellen, ob sie dieselbe Instanz sind. Mit anderen Worten, wenn Sie den Referenztyp mit dem Operator "==" vergleichen, werden die von den Variablen gehaltenen Referenzadressen verglichen, um festzustellen, ob sie dieselbe Instanz sind. Der gleiche Wert zwischen Variablen (Referenzadresse im Fall des Referenztyps) wird als gleicher Wert </ b> bezeichnet.

entspricht Methode

Ich verstehe die Betriebsspezifikationen des Operators "==". Aber ich möchte die Werte vergleichen, die ich intern habe ... Hier kommt die "Gleichheitsmethode" ins Spiel.

//Referenztypvergleich
Integer integerA = new Integer(1);
Integer integerB = new Integer(1);
System.out.println(integerA.equals(integerB)); // true

Mit der "equals-Methode" sieht es so aus, als würden Sie einen Wertevergleich durchführen. Also, welche Art von Verarbeitung wird tatsächlich in der Methode durchgeführt?

Integer.class


public final class Integer extends Number implements Comparable<Integer> {

    /*Unterlassung*/

    private final int value;

    public int intValue() {
        return value;
    }

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

    /*Unterlassung*/

}

Ich vergleiche meinen Wert (int) in der Methode mit dem Wert (int) im Argumentobjekt mit dem Operator "==". Mit anderen Worten, der Wert (primitiver Typ), den Sie in der Methode wirklich vergleichen möchten, wird mit dem Operator "==" verglichen. Auf diese Weise werden verschiedene Instanzen, aber der gleiche Wert von Instanzen als Äquivalent </ b> bezeichnet. Übrigens habe ich versucht zu sehen, was im Fall des String-Typs passiert ist.

String.class



public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /*Unterlassung*/

    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;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

    /*Unterlassung*/

}

Auch beim String-Typ wird der interne Wert (char []) zeichenweise verglichen. Wenn Sie Folgendes schreiben, ist das Ergebnis übrigens etwas anders.

String stringA = "String";
String stringB = "String";
System.out.println(stringA == stringB); // true

Das klingt anders, aber tatsächlich sind stringA und stringB der gleiche "String", sodass sie neu geschrieben werden, um beim Kompilieren auf dieselbe Instanz zu verweisen.

Bonus

Es gibt auch java.util.Objects # equals für Wertvergleiche.

String stringA = new String("String");
String stringB = new String("String");
String stringC = null;
System.out.println(java.util.Objects.equals(stringA, stringB)); // true
System.out.println(java.util.Objects.equals(stringA, stringC)); // false

Die "equals-Methode" des Objekts selbst verursacht häufig eine NullPointerException. Daher ist es möglicherweise eine gute Idee, diese Methode zu verwenden.

Schließlich

In Java scheint der primitive Typ den Datenwert zu enthalten, und der Referenztyp verweist darauf. Wenn Sie Rohdaten (primitiver Typ) vergleichen möchten, verwenden Sie den Operator "==". Wenn Sie Werte über den Referenztyp vergleichen möchten, verwenden Sie die Methode "equals" und lassen Sie sie intern den Operator "==" vergleichen. Es war peinlich gleichbedeutend mit dem gleichen Wert wie Zakuri ... Ich möchte mich weiterhin jeden Tag widmen.

Recommended Posts