При использовании == для примитива и упакованного значения выполняется автоупаковка или распаковка

Компилируется следующий код (с Java 8):

Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);

Но что он делает?

Распаковать i1:

boolean compared = (i1.intvalue() == i2);

или поле i2:

boolean compared = (i1 == new Integer(i2));

Итак, сравнивает ли он два объекта Integer (по ссылке) или две переменные int по значению?

Обратите внимание, что для некоторых чисел сравнение ссылок даст правильный результат, потому что класс Integer поддерживает внутренний кэш значений от -128 до 127 (см. также комментарий TheLostMind). Вот почему я использовал 1000 в своем примере и почему я специально спрашиваю о распаковке/упаковке, а не о результате сравнения.


person Thirler    schedule 26.05.2015    source источник
comment
Конечно, если бы вы запустили этот код и распечатали вывод, вы могли бы определить это самостоятельно.   -  person Scruffy    schedule 26.05.2015
comment
Вопрос не совсем такой, как тот, который использовался для пометки его как дубликат :)   -  person TheLostMind    schedule 26.05.2015
comment
Проверьте этот вопрос - правила автоматической упаковки. В его ответе, понятно, этот случай был освещен.   -  person Pham Trung    schedule 26.05.2015
comment
Я не думаю, что этот вопрос является дубликатом отмеченного. Этот вопрос спрашивает, как компилятор решает, упаковывать или распаковывать при сравнении примитива с объектом класса-оболочки. +1   -  person CKing    schedule 26.05.2015
comment
@Scruffy - это не так просто. Класс Integer поддерживает внутренний кеш значений между -128 to 127. Таким образом, даже если вы сравните Integer i1=100 с Integer i2=100, используя ==, вы получите true. Вы получите false, когда и i1, и i2 не находятся в этом диапазоне локального кэша.   -  person TheLostMind    schedule 26.05.2015
comment
@TheLostMind, хорошее замечание. Вот почему я выбрал 1000 в качестве примера, я добавлю это к вопросу.   -  person Thirler    schedule 26.05.2015
comment
@Thirler - теперь вопрос выглядит лучше :)   -  person TheLostMind    schedule 26.05.2015
comment
несколько связано: stackoverflow.com/a/30415260/719662   -  person    schedule 26.05.2015


Ответы (3)



Давайте сделаем несколько примеров:

Случай -1:

       public static void main(String[] args) {
            Integer i1 = 1000;
            int i2 = 1000;
            boolean compared = (i1 == i2);
            System.out.println(compared);
        }

Байтовый код:

....
        16: if_icmpne     23 // comparing 2 integers
....

Случай – 2:

public static void main(String[] args) {
    Integer i1 = 1000;
    Integer i2 = 1000;
    //int i2 = 1000;
    boolean compared = (i1 == i2);
    System.out.println(compared);
}

Байт-код:

...
     16: if_acmpne     23 // comparing references
....

Таким образом, в случае сравнения Integer и int с == Integer распаковывается в int, после чего происходит сравнение.

В случае сравнения 2 Integers сравниваются ссылки 2 Integers.

person TheLostMind    schedule 26.05.2015

Пояснение

  1. Когда два примитивных значения сравниваются с использованием оператора ==, автоупаковка не происходит.

  2. Когда два объекта сравниваются с использованием оператора ==, автоматический бокс играет роль.

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

Пожалуйста, перейдите по ссылке ниже, которая поможет вам получить подробное представление об автобоксе с подходящим примером.

Ссылка: http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-java-be.html

person karan shah    schedule 26.05.2015