@ Ответ Шовера верен (читай!), Но здесь есть кое-что еще.
Как Javadoc для Double::equals
состояния:
"Это определение позволяет хэш-таблицам работать правильно."
Предположим, что разработчики Java решили реализовать equals(...)
и compare(...)
с той же семантикой, что и ==
в обернутых double
экземплярах. Это будет означать, что equals()
всегда будет возвращать false
для завернутого NaN. Теперь подумайте, что произойдет, если вы попытаетесь использовать завернутый NaN в карте или коллекции.
List<Double> l = new ArrayList<Double>();
l.add(Double.NaN);
if (l.contains(Double.NaN)) {
// this wont be executed.
}
Map<Object,String> m = new HashMap<Object,String>();
m.put(Double.NaN, "Hi mum");
if (m.get(Double.NaN) != null) {
// this wont be executed.
}
Не имеет большого смысла, не так ли!
Другие аномалии могут существовать, потому что -0.0
и +0.0
имеют разные битовые комбинации, но равны согласно ==
.
Таким образом, разработчики Java решили (справедливо IMO) более сложное (но более интуитивное) определение для этих методов Double, которое мы имеем сегодня.