Рассмотрим следующий пример:Понимание Double Autoboxing
public static void main(String[] args) {
double x1 = 0.0, y1 = -0.0;
Double a1 = x1, b1 = y1;
System.out.println(x1 == y1); //1, true
System.out.println(a1.equals(b1)); //2, false
double x2 = 0.0, y2 = 0.0;
Double a2 = x2, b2 = y2;
System.out.println(x2 == y2); //3, true
System.out.println(a2.equals(b2)); //4, true
double x3 = 0.0/0.0, y3 = 0.0/0.0;
Double a3 = x3, b3 = y3;
System.out.println(x3 != y3); //5, true
System.out.println(!a3.equals(b3)); //6, false
}
Я пытался понять Autoboxing для Double
, но не смог. Почему //2
печатает false
, но //4
печатает true
тогда как оба //1
и //3
отпечатки true
. Почему они автообновлены по-другому?
Консалтинг следующего JLS 5.1.7 раздела я понял, что это не specicified:
Если р является значением типа двойного, то:
Если р не NaN, преобразование бокса преобразует р в ссылочную позицию r класс и тип Double, так что r.doubleValue() вычисляется как p
В противном случае конверсия бокса преобразуется p в опорном г класса и типа двойной таким образом, что r.isNaN() вычисляется в истинный
Так, являются //2
, //4
и //6
в неустановленном получал метод поведения и, возможно, в конечном итоге в разных результатах в зависимости от реализация?
http://docs.oracle.com/javase/8/docs/api/java/lang/Double.html#equals-java.lang.Object- ответ на ваш точный вопрос. – ajb