2015-05-26 69 views
38

unboxing Poniższe kompiluje kod (z Java 8):Podczas korzystania == za prymitywne i wartości pudełkowej jest autoboxing wykonane lub są wykonywane

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

ale co to robi?

Unbox i1:

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

lub pudełko i2:

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

Więc to porównanie dwóch Integer przedmiotów (odnośnik) lub dwa int zmiennych przez wartość?

Należy zauważyć, że dla niektórych liczb porównanie porównawcze da poprawny wynik, ponieważ klasa Integer utrzymuje wewnętrzny bufor wartości między -128 a 127 (patrz także komentarz TheLostMind). Dlatego w moim przykładzie użyłem 1000 i dlaczego specjalnie pytam o rozpakowanie/boks, a nie o wynik porównania.

+9

pewnością jeśli prowadził ten kod i wydrukować dane wyjściowe można określić ten sam. – Scruffy

+0

Pytanie nie jest dokładnie takie samo, jak to oznaczono jako duplikat :) – TheLostMind

+0

Sprawdź to [pytanie - zasady boksowania automatycznego] (http://stackoverflow.com/questions/12559634/java-autoboxing-rules). W swojej odpowiedzi oczywiście sprawa ta została uwzględniona. –

Odpowiedz

38

to jest zdefiniowane w JLS #15.21.1:

Jeśli operandy operatora równości są zarówno typu numerycznej albo jeden jest typu numerycznej, a drugi może być zamieniona (§5.1.8) rodzaju numerycznej , binarna promocja numeryczna jest wykonywana na operandach (§5.6.2).

I JLS #5.6.2:

Kiedy operator stosuje binarnego promocji numerycznej parę argumentów, z których każda musi oznaczać wartość, która jest wymienialna do typu numerycznego, stosuje się następujące zasady w celu :

  • Jeśli dowolny operand jest typu referencyjnego, jest poddawany konwersji rozpakowywanej [...]

więc odpowiedzieć na pytanie, Integer jest bez opakowania w produkt int.

32

Pozwala zrobić kilka przykładów:

przypadek -1: kod

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

bajtów:

.... 
     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 
.... 

Tak więc, w przypadku porównywania Integer i int z ==Integer jest rozpakowanych do int a następnie porównanie dzieje.

W przypadku porównania 2 Integers porównuje się odniesienia 2 Integers.

-1

Wyjaśnienie

  1. Kiedy dwie wartości są porównywane przy użyciu prymitywnych == operator autoboxing nie odbędzie.

  2. Po porównaniu dwóch obiektów za pomocą == operator autoboxing odgrywa rolę .

  3. po zmieszaniu połączenie jest wykorzystywane to, że zawiera obiekt i pierwotnych i porównania jest wykonywana za pomocą == operatora unboxing dzieje się obiektu i przekształca się do pierwotnych.

Proszę przejść przez poniższy link, który pomoże ci zrozumieć szczegóły dotyczące auto-boxingu z odpowiednim przykładem.

Patrz link: http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-java-be.html