Как оператор равенства работает с данными примитива и типа объекта
Я знаю, что это очень простой вопрос, но я хочу прояснить концепцию. Я хочу знать как ==
оператор работает в случае примитива и типа объекта. Например
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 и ==
будет сравнивать примитивы (т.е. верно в вашем случае).