Krótka odpowiedź: Eclipse wykorzystuje Double.doubleToLongBits bo to właśnie Double.equals robi:
Rezultatem jest true
wtedy i tylko wtedy, gdy argument nie jest null
i to dwukrotnie obiekt, który reprezentuje doubl
E, który ma taka sama wartość jak double
reprezentowana przez ten obiekt. W tym celu dwie wartości double
są uważane za takie same wtedy i tylko wtedy, gdy metoda doubleToLongBits(double)
zwraca identyczną wartość long
po zastosowaniu do każdego z nich.
Długa odpowiedź: JLS określa kilka różnic między Double.equals i ==. Dla jednej różnicy określonej w JLS 4.2.3 i JLS 15.21.1:
Pozytywne i negatywne zerowy zerowy porównania równe; tak więc wynik wyrażenia 0.0==-0.0
jest wynikiem tego, że wynik jest następujący: .Ale inne operacje mogą odróżnić pozytywne i negatywne zero; na przykład 1.0/0.0
ma wartość dodatnią nieskończoności, a wartość 1.0/-0.0
jest ujemną nieskończonością.
Kolejne pozdrowienia NaN
:
Jeśli któryś argument jest NaN, wówczas wynikiem ==
jest false
ale wynik !=
jest true
.
Rzeczywiście, test x!=x
jest wtedy i tylko wtedy, gdy wartość x jest NaN.
Jak widać, jest to możliwe dla dwóch wartości podwójnych porównać z ==
ale faktycznie odpowiadają różne zachowanie kiedy używane w matematyce i hash tabel. Tak więc, pisząc wygenerowaną metodę równości, Eclipse przyjmuje założenie, że dwa podwojenia są równe tylko wtedy i tylko wtedy, gdy wszystkie operacje, które można z nimi zrobić, są identyczne, lub (równoważnie), jeśli były one autoboxowane i porównywane z ich metodami equals
. Jest to szczególnie ważne, jeśli przełączanie między double
i Double
-jest szczególnie nieoczekiwane, ponieważ właściwości równości są tam różne.
Oczywiście możesz odejść od tego założenia: Niezależnie od tego, czy jest to dobry pomysł, możesz przypisać specjalne przypadki do dowolnej z wielu możliwych reprezentacji NaN, w takim przypadku Double.doubleToRawLongBits()
będzie lepiej pasować do Twojego Metody: equals
i hashCode
. Z tego samego powodu, twój przypadek użycia może traktować obiekty z +0,0 i -0,0 jako równoważne i gwarantować, że wartości NaN nie są możliwe, w takim przypadku surowe porównanie ==
może działać lepiej dla equals
(ale w którym momencie emulacja tych samych kryteriów dla hashCode
staje się trudne).