Kurze Antwort: Eklipse verwendet Double.doubleToLongBits, weil das ist, was Double.equals tut:
Das Ergebnis ist true
, wenn und nur wenn das Argument nicht null
und ist ein Doppel Objekt, das ein doubl
e, die das hat repräsentiert gleicher Wert wie double
, dargestellt durch dieses Objekt. Zu diesem Zweck werden zwei double
Werte als gleich betrachtet, wenn und nur wenn die Methode doubleToLongBits(double)
den identischen long
Wert zurückgibt, wenn sie auf beide angewendet wird.
Lange Antwort: Die JLS gibt einige Unterschiede zwischen Double.equals und == an. Für eine spezifizierte Differenz in JLS 4.2.3 und JLS 15.21.1:
Positive und negative Null Null zu vergleichen, gleich sind; somit ist das Ergebnis des Ausdrucks 0.0==-0.0
true
und das Ergebnis 0.0>-0.0
ist false
.Aber andere Operationen können positive und negative Null unterscheiden; zum Beispiel hat den Wert positive Unendlichkeit, während der Wert negative Unendlichkeit ist.
Weitere Grüße NaN
:
Wenn einer der Operanden NaN ist, dann ist das Ergebnis der ==
false
sondern das Ergebnis !=
ist true
.
In der Tat ist der Test x!=x
true
wenn und nur wenn der Wert von x NaN ist.
Wie Sie sehen können, es ist möglich, dass zwei Doppel Werte mit ==
zu vergleichen, sondern tatsächlich einem anderen Verhalten entsprechen, wenn in Mathematik und Hash-Tabellen verwendet. Beim Schreiben einer generierten Gleichheitsmethode macht Eclipse daher die Annahme, dass zwei Doubles nur dann gleich sind, wenn alle Operationen, die mit ihnen durchgeführt werden können, identisch sind oder (äquivalent) wenn sie autoboxiert und mit ihren equals
Methoden verglichen werden. Dies ist besonders wichtig, wenn das Umschalten zwischen double
und Double
-it besonders unerwartet wäre, da die Gleichheitseigenschaften sich dort unterscheiden.
Natürlich können Sie von dieser Annahme abweichen: Unabhängig davon, ob es eine gute Idee ist, können Sie Sonderfälle auf jede der vielen möglichen NaN-Darstellungen zuweisen, in welchem Fall Double.doubleToRawLongBits()
wäre eine bessere Übereinstimmung für Ihre equals
und hashCode
Methoden. Desgleichen könnte Ihr Anwendungsfall Objekte mit +0.0 und -0.0 als äquivalent behandeln und garantieren, dass NaN - Werte nicht möglich sind. In diesem Fall könnte ein roher ==
- Vergleich für equals
besser funktionieren (aber an diesem Punkt dieselben Kriterien für hashCode
wird schwierig).