Почему двойное "==" и "равно" двойному?

Пожалуйста, объясните следующую ситуацию:

double d3=(double) 1;
Double d4=new Double(1);
System.out.println(d4==d3); // true
System.out.println(d4.equals(d3)) // true

Почему оба эти печати true?

2 ответа

Решение

Из спецификации языка Java 15.21.1:

Если оба операнда оператора равенства имеют числовой тип или один имеет числовой тип, а другой преобразуется (§5.1.8) в числовой тип, двоичные числовые преобразования выполняются над операндами (§5.6.2).

Обратите внимание, что двоичное числовое продвижение выполняет преобразование набора значений (§5.1.13) и может выполнять преобразование без коробки (§5.1.8).

Распаковка конвертации - именно то, что происходит здесь: d4 распакован в его значение, 1.0, который затем сравнивается с d3значение, которое также 1.0,

От вашего вопроса кажется, что вы ожидаете d3 == d4 быть false потому что они разные "ссылки"; однако примитивные типы никогда не могут быть ссылками, поэтому любое сравнение на равенство с примитивным типом требует преобразования в этот примитивный тип. Это видно из правил JLS, касающихся равенства объектов в 15.21.3:

Если операнды оператора равенства имеют либо ссылочный тип, либо нулевой тип, то операция является объектным равенством.

Это единственная ситуация, когда происходит равенство объектов, и оно не включает примитивные типы.

double является примитивным типом, в то время как Double это класс, который действует как обертка вокруг double, (Вот почему, например, вы получите сообщение об ошибке, если попытаетесь использовать d3.equal) Для удобства сравнения между этими двумя работами ожидаются, просто учитывая их числовые значения; в этом случае, поскольку они оба равны 1, они считаются равными.

Другие вопросы по тегам