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.
Geben Sie hier den Titel des Verzeichnisses ein
-
-
- 1. Offizieller Quellcode von Objects.equals()
- 2. Analysieren Sie die Ausführungsergebnisse des folgenden Codes
- 3. Antworten auf wichtige Fragen
-
- 3.1 System.out.println(Objects.equals(integer100, byte100));
- 3.2 System.out.println(Objects.equals(long200, 200));
- 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 den „Vergleich von Typen“ ignoriert und uns nur auf den Vergleich von Werten konzentriert.
-
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.
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.
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 .
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 返回的是false
ist das so? Unterbrechen Sie als Nächstes das Debuggen im Quellcode, wie in der Abbildung gezeigt:
Schritt 1: Setzen Sie einen Haltepunkt.
Schritt 2: Daraus können Sie erkennen, dass der Basisdatentyp (int) 200 im nächsten 自动装箱为Integer
Schritt 3 festgelegt ist
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
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.