Подтвердить что ты не робот

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

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

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

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

Unbox i1:

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

или поле i2:

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

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

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

4b9b3361

Ответ 1

Он определен в JLS # 15.21.1:

Если операнды оператора равенства являются как числовыми, либо одно из числового типа, а другие являются конвертируемыми (п. 5.1.8) в числовой тип, двоичная цифровая продвижение выполняется в операндах (§5.6.2).

И JLS # 5.6.2:

Когда оператор применяет двоичное числовое продвижение к паре операндов, каждый из которых должен обозначать значение, которое можно конвертировать в числовой тип, применяются следующие правила, чтобы:

  • Если какой-либо операнд имеет ссылочный тип, он подвергается распаковке преобразования [...]

Итак, чтобы ответить на ваш вопрос, Integer распакован в int.

Ответ 2

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

Случай -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.

Ответ 3

Объяснение

  • При сравнении двух примитивных значений с использованием == autoboxing оператора operator не происходит.

  • При сравнении двух объектов с использованием == autoboxing роль.

  • Если используется смешанная комбинация, которая содержит объект и примитивный тип и сравнение выполняется с помощью == operator unboxing происходит на объекте и преобразуется в примитивный тип.

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

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