Gdy używasz == dla prymitywnej i pudełkowej wartości, czy autoboxing jest gotowy, czy też jest gotowy unboxing

Następujący kod kompiluje (z Java 8):

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

Ale co to robi?

Unbox i1:

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

Lub pole i2:

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

Więc porównuje dwa obiekty Integer (przez odniesienie) lub dwie zmienne int według wartości?

Zauważ, że dla niektórych liczb porównanie referencji da poprawny wynik, ponieważ Klasa Integer utrzymuje wewnętrzny bufor wartości między -128 a 127 (Zobacz także komentarz thelostmind). Dlatego użyłem 1000 w moim przykładzie i dlaczego konkretnie pytam o unboxing/boks, a nie o wynik porównania.

Author: Raedwald, 2015-05-26

3 answers

Jest zdefiniowany w JLS #15.21.1:

Jeśli operandami operatora równości są oba typu numerycznego, lub jeden jest typu numerycznego, a drugi jest zamieniany (§5.1.8) na typ numeryczny, binarna promocja liczbowa jest wykonywana na operandach (§5.6.2).

I JLS #5.6.2:

Gdy operator stosuje binarną promocję liczbową do pary operandów, z których każdy musi oznaczać wartość zamienioną na typ liczbowy, stosuje się następujące zasady, w kolejności:

  • Jeśli jakikolwiek operand jest typu referencyjnego, jest poddawany konwersji unboxingu [...]

Więc aby odpowiedzieć na twoje pytanie, {[0] } jest unboxed do int.

 44
Author: assylias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-26 09:37:36

Zróbmy kilka przykładów:

Case -1 :

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

Kod bajtowy:

....
        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ównania Integer i int z == Integer jest nieboxowane do int i następuje porównanie.

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

 34
Author: TheLostMind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-26 09:35:51

Explanation

  1. Gdy porównuje się dwie prymitywne wartości za pomocą = = Operator autoboxing nie ma miejsca.

  2. Gdy porównuje się dwa obiekty za pomocą = = operator autoboxing plays rola.

  3. Gdy używana jest kombinacja mieszana, to znaczy, że zawiera obiekt i prymitywny typ i porównanie odbywa się za pomocą = = Operator unboxing dzieje się na obiekcie i jest konwertowany na typ prymitywny.

Proszę przejść przez poniższy link które pomogą ci uzyskać szczegółowe informacje na temat auto-boksu z odpowiednim przykładem.

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

 1
Author: karan shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-02 09:34:12