wrappers ejemplos java integer autoboxing

ejemplos - Pregunta de Java sobre el autoboxing y la igualdad/identidad de objetos



autoboxing java (7)

Debido a que Integer es para algunos números bajos como enumeración, siempre hay la misma instancia. Pero los números más altos crean nuevas instancias de Integer y el operador == compara sus referencias

Esta pregunta ya tiene una respuesta aquí:

public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here int a1 = 1000, a2 = 1000; System.out.println(a1==a2);//=>true Integer b1 = 1000, b2 = 1000; System.out.println(b1 == b2);//=>false Integer c1 = 100, c2 = 100; System.out.println(c1 == c2);//=>true } }

¿Por qué es b1 == b2 falso y c1 == c2 verdadero?


La respuesta que quieres está here


Las respuestas correctas ya han sido dadas. Pero solo para sumar mis dos centavos:

Integer b1 = 1000, b2 = 1000;

Este es un código horrible. Los objetos deben inicializarse como Objetos a través de constructores o métodos de fábrica. P.ej

// let java decide if a new object must be created or one is taken from the pool Integer b1 = Integer.valueOf(1000);

o

// always use a new object Integer b2 = new Integer(1000);

Este codigo

Integer b1 = 1000, b2 = 1000;

por otro lado implica que el Integer era un primitivo, que no lo es. En realidad lo que estás viendo es un atajo para

Integer b1 = Integer.valueOf(1000), b2 = Integer.valueOf(1000);

y Integer solo agrupa objetos de -127 a 127, por lo que creará dos nuevos Objetos en este caso. Entonces, aunque 1000 = 1000, b1! = B2. Esta es la razón principal por la que odio el auto-boxeo.


Lee this

Java usa una agrupación para Integer en el rango de -128 a 127.

Eso significa que si creas un Integer con Integer i = 42; y su valor está entre -128 y 128, no se crea ningún objeto nuevo, pero se devuelve el correspondiente del conjunto. Es por eso que c1 es de hecho idéntico a c2 .

( Supongo que sabe que == compara referencias, no valores, cuando se aplica a objetos ).


Puedes encontrar la respuesta aquí:

Característica más extraña del lenguaje en la sexta respuesta.

Edit: lo siento no exatly la respuesta. El punto es que == compara referencias, no valores cuando lo usas con Integer. Pero con int "==" significa iguales.


Si el autounboxing hubiera funcionado también al realizar la comprobación de igualdad con el operador ''=='', podría escribir:

Long notNullSafeLong1 = new Long(11L) Long notNullSafeLong2 = new Long(22L) if ( notNullSafeLong1 == notNullSafeLong2) { do suff

Esto requeriría implementar una anulación para == de modo que null == someLong sea falso y el caso especial Null == Null sea verdadero. En su lugar, tenemos que usar igual () y probar para nulo

Long notNullSafeLong1 = new Long(11L) Long notNullSafeLong2 = new Long(22L) if ( (notNullSafeLong1 == null && notNullSafeLong2 == null) || (notNullSafeLong1 != null && notNullSafeLong2 != null & notNullSafeLong1.equals(notNullSafeLong2)) { do suff

Esto es un poco más detallado que el primer ejemplo, si el autounboxing hubiera funcionado para el operador ''==''.


public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); }

Por eso eres verdadero en un caso, y falso en otro!