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

Следующий код компилируется (с 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 по значению?

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

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

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

И JLS # 5.6.2 :

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

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

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

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

Дело 1 :

  public static void main(String[] args) { Integer i1 = 1000; int i2 = 1000; boolean compared = (i1 == i2); System.out.println(compared); } по  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); } по 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 .

объяснение

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

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

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

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

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

  • Как работают servlets? Создание, сеансы, общие переменные и multithreading
  • Должны ли получатели Java 8 возвращать дополнительный тип?
  • Java: как эффективно проверить нулевые указатели
  • Чтение из System.in - Java
  • Статическая инициализация переменных?
  • Как скопировать текст из Java-программы?
  • Преобразование коллекции Java в коллекцию Scala
  • Как получить имя вызывающего classа в Java?
  • ошибка с varargs и перегрузка?
  • Java: чтение последних n строк файла HUGE
  • Есть ли способ сделать n-уровневые вложенные циклы в Java?
  • Давайте будем гением компьютера.