Почему двойное "==" и "равно" двойному?
Пожалуйста, объясните следующую ситуацию:
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, они считаются равными.