Обычно оператор равенства в Java выполняет так называемое поверхностное сравнение. Другими словами, он сравнивает значения, содержащиеся в переменных. Теперь переменные примитивных типов данных содержат само значение, а ссылочные типы содержат ссылку на область кучи, в которой хранится фактическое содержимое. Это означает, что в вашем фрагменте кода int b
будет храниться значение 1
, а Integer a
будет содержать адрес памяти фактического объекта Integer в куче.
Теперь в приведенном вами конкретном примере есть одна особенность. Целочисленный класс — специальный класс-оболочка, который оборачивает примитивные целочисленные типы. Компилятор может автоматически преобразовывать такие объекты-оболочки в примитивные типы (что называется упаковкой и распаковкой).
Давайте рассмотрим код шаг за шагом, чтобы сделать его понятным.
Integer a = 1;
Компилятор фактически заменяет следующий код этой строки:
Integer a = Integer.valueOf(1);
Статический метод valueOf
возвращает экземпляр объекта-оболочки, который упаковывает предоставленное примитивное значение. Эта процедура, когда компилятор создает класс-оболочку из примитивного типа, называется упаковкой.
При использовании такой оболочки объект сравнивается с примитивной переменной с помощью оператора равенства
a == b
компилятор фактически меняет его на следующее:
a.intValue() == b;
где intValue
возвращает значение примитива, обернутое объектом-оболочкой (что называется распаковкой), т. е. оно распаковывает значение примитива и делает выражение эквивалентным сравнению двух примитивов. Вот почему оператор равенства вернул true
person
akhilless
schedule
19.03.2015