Die Grube der Objects.equals-Methode

Vorwort: Die Methode Objects.equals() ist eine Werkzeugklasse unter java.util, mit der die Gleichheit zweier Objekte verglichen werden kann, wodurch umständliche Nullzeigerbeurteilungen vermieden werden.

Dieser Artikel wird durch Codebeispiele erweitert, durch Quellcode-Haltepunkt-Debugging analysiert und einige Probleme behandelt, die bei Verwendung der Objects.equals()-Methode leicht übersehen werden.

1. Offizieller Quellcode von Objects.equals()

这里我们先看Objects.equals()的官方源码

    /**
     * Returns {@code true} if the arguments are equal to each other
     * and {@code false} otherwise.
     * Consequently, if both arguments are {@code null}, {@code true}
     * is returned and if exactly one argument is {@code null}, {@code
     * false} is returned.  Otherwise, equality is determined by using
     * the {@link Object#equals equals} method of the first
     * argument.
     *
     * @param a an object
     * @param b an object to be compared with {@code a} for equality
     * @return {@code true} if the arguments are equal to each other
     * and {@code false} otherwise
     * @see Object#equals(Object)
     */
    public static boolean equals(Object a, Object b) {
    
    
        return (a == b) || (a != null && a.equals(b));
    }

2. Analysieren Sie die Ausführungsergebnisse des folgenden Codes

    public static void main(String[] args) {
    
    
        Integer integer1 = Integer.valueOf(1);
        Integer integer200 = Integer.valueOf(200);
        Integer integer100 = Integer.valueOf(100);
        Long long200 = 200L;
        Byte Byte100 = (byte) 100;
        byte byte100 = (byte) 100;
        System.out.println("--------------------Integer-----------------------");
        System.out.println(Objects.equals(integer1, 1));         // true
        System.out.println(Objects.equals(integer200, 200));     // true
        System.out.println(Objects.equals(integer100, byte100));    // false
        System.out.println(Objects.equals(integer100, Byte100));    // false
        System.out.println("--------------------Long--------------------------");
        System.out.println(Objects.equals(long200, 200L));      // true
        System.out.println(Objects.equals(long200, 200));       // false
        System.out.println(Objects.equals(long200, integer200));    //false
        System.out.println("--------------------Byte--------------------------");
        System.out.println(Objects.equals(Byte100, 100));       // false
        System.out.println(Objects.equals(Byte100, (byte) 100));    // true
        System.out.println(Objects.equals(Byte100, byte100));       // true
        System.out.println("--------------------byte--------------------------");
        System.out.println(Objects.equals(byte100, 100));       // false
        System.out.println(Objects.equals(byte100, (byte) 100));   // true
        System.out.println(Objects.equals(100,byte100));        // false
    }

3. Antworten auf wichtige Fragen

3.1 System.out.println(Objects.equals(integer100, byte100));

Diese beiden sind beide 赋值100, aber wenn man Objects.equals() zum Vergleich verwendet, stellt man fest, dass die Rückgabe falsch ist. Warum ist das so? Unterbrechen Sie als Nächstes das Debuggen im Quellcode, wie in der Abbildung gezeigt:
Schritt 1: Legen Sie einen Haltepunkt fest.
Fügen Sie hier eine Bildbeschreibung ein
Schritt 2: Springen Sie am Haltepunkt in die Methode Objects.equals ()
Sie können sehen, dass unsere Basisdatentypvariable byte100 gelöscht wurde 自动装箱为Byte包装类Der nächste Schritt ist die Gleichheitsmethode von Integer.
Fügen Sie hier eine Bildbeschreibung ein
Der dritte Schritt besteht darin, in die Methode einzubrechen Integer.equals(). Es ist ersichtlich, dass die Methode Integer.equals () direkt false zurückgibt, anstatt Werte zu vergleichen, da Byte keine Instanz von Integer ist .
Fügen Sie hier eine Bildbeschreibung ein

3.2 System.out.println(Objects.equals(long200, 200));

Einer ist 200L und der andere ist 200, was für unser Trägheitsdenken definitiv als wahr angesehen wird, aber wenn wir Objects.equals() zum Vergleich verwenden, stellen wir fest, warum 返回的是falseist das so? Unterbrechen Sie als Nächstes das Debuggen im Quellcode, wie in der Abbildung gezeigt:
Schritt 1: Setzen Sie einen Haltepunkt.
Fügen Sie hier eine Bildbeschreibung ein
Schritt 2: Daraus können Sie erkennen, dass der Basisdatentyp (int) 200 im nächsten 自动装箱为IntegerSchritt 3 festgelegt ist
Fügen Sie hier eine Bildbeschreibung ein
In diesem Schritt springt der Haltepunkt direkt in die Long.equals()-Methode, wie in der Abbildung gezeigt:
Da die beiden überhaupt nicht vom gleichen Objekttyp sind und daher direkt false zurückgeben, ist das Prinzip dasselbe wie in 3.1 oben
Fügen Sie hier eine Bildbeschreibung ein

Zusammenfassung: Der wesentliche Grund für das obige Problem besteht darin, dass bei Verwendung der Methode Object.equals () die grundlegenden Datentypen automatisch geboxt werden und anschließend der Gleichheitsvergleich der entsprechenden Wrapper-Klassen durchgeführt wird. Und wir haben es ignoriert 类型的比较und nur auf den Vergleich der Werte geachtet.

Abgesehen davon ist dies in der Tat kein Problem mit der Methode Objects.equals(). Wir nehmen es einfach als selbstverständlich hin und verstehen, dass es nicht mit der Ausführung von Computercodes vereinbar ist. Dies sagt uns auch Folgendes Gründe dafür. Wenn wir die Räder anderer verwenden, müssen wir uns beim schnellen, effizienten und bequemen Schreiben von Code über deren entsprechende Funktionsgrenzen, Nutzungsszenarien und Fehlerszenarien im Klaren sein, damit wir korrekten Code mit weniger Fehlern schreiben können.

Ich denke du magst

Origin blog.csdn.net/lzq2357639195/article/details/131166898
Empfohlen
Rangfolge