Как оператор равенства работает с данными примитива и типа объекта

Я знаю, что это очень простой вопрос, но я хочу прояснить концепцию. Я хочу знать как == оператор работает в случае примитива и типа объекта. Например

Integer a = 1;
int b = 1;
System.out.println(a == b)

как a по сравнению с b, в то время как a содержит ссылку на объект, который содержит значение 1. Может кто-нибудь прояснить мне, как это работает внутри?

2 ответа

Решение

В общем случае оператор равенства в Java выполняет так называемое поверхностное сравнение. Другими словами, он сравнивает значения, содержащиеся в переменных. Теперь переменные примитивных типов данных содержат само значение, а ссылочные типы содержат ссылку на область кучи, в которой хранится фактический контент. Это означает, что в вашем фрагменте кода int b будет держать значение 1 а также Integer a будет хранить адрес памяти фактического целочисленного объекта в куче.

Теперь в приведенном вами конкретном примере есть одна особенность. Целочисленный класс - специальный класс-обертка, который обертывает примитивные целочисленные типы. Компилятор может автоматически конвертировать между такими объектами-обертками и примитивными типами (это называется боксом и распаковкой).

Давайте рассмотрим код пошагово, чтобы прояснить ситуацию.

Integer a = 1;

Компилятор фактически заменяет следующий код этой строки:

Integer a = Integer.valueOf(1);

Статический метод valueOf возвращает экземпляр объекта-обертки, который упаковывает предоставленное примитивное значение. Эта процедура, когда компилятор создает класс-оболочку из примитивного типа, называется боксом.

При использовании такой обертки объект сравнивается с примитивной переменной с помощью оператора равенства

a == b

компилятор фактически меняет его на следующее:

a.intValue() == b;

где intValue возвращает значение примитива, упакованное объектом-оберткой (которое называется unboxing), т.е. оно распаковывает примитивное значение и делает выражение эквивалентным сравнению двух примитивов. Вот почему оператор равенства затем вернулся true

В вашем конкретном примере упакованный тип Integer будет распакован в примитивный тип int и == будет сравнивать примитивы (т.е. верно в вашем случае).

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