2015-05-26 2 views
38

Следующего кода компилирует (с Java 8):При использовании == для примитивного и коробочного значения, это Autoboxing сделан, или распаковка сделан

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 в своем примере и почему я специально задаю вопрос о распаковке/боксе, а не о результате сравнения.

+9

Конечно, если вы запускали этот код и напечатал вывод, который вы могли бы определить это самостоятельно. – Scruffy

+0

Вопрос не совсем такой же, как тот, который использовался для обозначения его как дубликата :) – TheLostMind

+0

Установите этот флажок [вопрос - правила автоматического бокса] (http://stackoverflow.com/questions/12559634/java-autoboxing-rules). В его ответе, очевидно, этот случай был рассмотрен. –

ответ

38

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

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

И JLS #5.6.2:

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

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

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

32

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

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

Case -2:

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

Bytecode:

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

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

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

-1

Объяснение

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

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

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

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

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

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