В общем случае оператор равенства в Java выполняет так называемое мелкое сравнение. Другими словами, он сравнивает значения, которые содержат переменные. Теперь переменные примитивных типов данных содержат само значение, а ссылочные типы содержат ссылку на область кучи, в которой хранится фактическое содержимое. Это означает, что в вашем фрагменте кода int b
будет содержать значение 1
, а Integer a
будет хранить адрес памяти фактического объекта Integer в куче.
Теперь в конкретном примере, представленном вами, есть одна особенность. Целочисленный класс - специальный класс-оболочка, который обертывает примитивные целые типы. Компилятор может автоматически конвертировать между такими объектами-оболочками и примитивными типами (которые называются бокс и распаковкой).
Давайте проверим вас шаг за шагом, сделайте это ясно.
Integer a = 1;
Компилятор фактически substitue следующий код InstEd этой линии:
Integer a = Integer.valueOf(1);
Статический метод valueOf
возвращает экземпляр объекта оболочку, которая обертывает предоставленный элементарное значение. Эта процедура, когда компилятор создает класс-оболочку из примитивного типа, называется боксом.
При использовании такого объекта-оболочки сравнивается с с примитивной переменной с помощью оператора равенства
a == b
компилятор фактически изменяет его на следующее:
a.intValue() == b;
, где обернутые intValue
возвращает примитивное значение через объект-оболочку (который называется unboxing), то есть он освобождает примитивное значение и делает выражение эквивалентным для сравнения двух примитивов. Вот почему оператор равенства затем вернулся true
Посмотрите на ответы на [этот вопрос] (http://stackoverflow.com/q/20877086), который тесно связан. Вы также можете прочитать [auto-unboxing] (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html), который будет использоваться в коде, который вы указали. –
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – ha9u63ar
Возможный дубликат [При использовании == для примитива и значения в коробке выполняется автобоксирование или выполняется распаковка] (http : //stackoverflow.com/questions/30454635/when-using-for-a-primitive-and-a-boxed-value-is-autoboxing-done-or-is-unbox) – davidwebster48