Привет, я пересматриваю и понимаю разницу между equals() и '==', однако этот код меня действительно смущает:
public class MyTest {
public static void main(String[] args) {
Integer w = new Integer(1);
Integer x = 1;
double z = x;
System.out.println(z == w);
}
}
Как двойной объект может иметь такую же ссылку, как объект Integer в памяти при использовании '=='? Не могу понять это. Спасибо за чтение!
Если вы сравниваете примитив и обертку с помощью ==
operator, то значения оболочки будут без полей и сравниваться с примитивным значением.
Из JLS 15.21.1
15.21.1. Операторы числового равенства == и! =
Если операнды оператора равенства имеют числовой тип или один из них имеет числовой тип, а другой является конвертируемым (п. 5.1.8) в числовой тип, двоичная цифровая продвижение выполняется в операндах (§5.6.2).
double
не является ссылкой, потому что это примитивный тип. Это значение вместо этого. Double
был бы ссылкой.
Когда вы пишете z == w
, где z
является double
-typed, а w
является Integer
-typed, время выполнения определенно должно что-то сравнивать. И, очевидно, он должен сравнивать вещи одного и того же типа. Он не будет сравнивать double
значение с ссылкой Integer
. Вместо этого он будет распаковать Integer
и будет сравнивать значение int
полученное после распаковки, с double
значением. Оба они равны 1, логический оператор вернет true
.
Здесь объекты не сравниваются, а primitive
типы сравниваются с feature
unboxing для Integer
.