2015-03-19 1 views
8

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

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

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

+4

Посмотрите на ответы на [этот вопрос] (http://stackoverflow.com/q/20877086), который тесно связан. Вы также можете прочитать [auto-unboxing] (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html), который будет использоваться в коде, который вы указали. –

+0

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – ha9u63ar

+0

Возможный дубликат [При использовании == для примитива и значения в коробке выполняется автобоксирование или выполняется распаковка] (http : //stackoverflow.com/questions/30454635/when-using-for-a-primitive-and-a-boxed-value-is-autoboxing-done-or-is-unbox) – davidwebster48

ответ

7

В общем случае оператор равенства в 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

4

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

+0

Это означает, что сначала автоматически распаковывается value ((autounboxing) obj == val) сравнивается в памяти, а не ref == val. исправьте меня, если мое понимание ошибочно. –

+0

Не уверен, что я понял ваш комментарий, но вот спецификация для преобразования unboxing: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.8 –

+0

да, сравнение объекта-оболочки с примитивным типом приводит к распаковке, так что вы в итоге сравниваете два примитивных значения, см. мой ответ – akhilless

Смежные вопросы