Duda en Wrapper: 'equals', '==' y '!='

De que depende el resultado de == y ¡= cuando se comparan dos wrapper usando '==', ¿porque cuando el valor es mayor a 127 ya no los considera el mismo objeto?.

Aquí el código para probarlo:

public class Autoboxing {

    public static void main(String[] args) {
        new Autoboxing().doStuff();
    }

    void doStuff() {
        Integer i1 = 127;
        Integer i2 = 127;
        if (i1 != i2) System.out.println("different objects");
        if (i1.equals(i2)) {
            System.out.println("meaningfully equal");
        }
        if (i1 == i2) {System.out.println("Same objects");}

        Integer i3 = 128;
        Integer i4 = 128;
        if (i3 == i4) {
            System.out.println("same object");
        }
        if (i3.equals(i4)) {
            System.out.println("meaningfully equal");
        }

    }
}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

javap

Qué te sale en el javap? A lo mejor es una optimización del compilador, literales enteras menores a 127 las tiene internalizadas (como objetos tipo Integer) pero de 128 para arriba ya las crea cuando se necesitan...

@ezamudio No es exactamente

@ezamudio No es exactamente una optimizacion del compilador sino precisamente lo que segundo que dices: hay un pool de objetos que va de -128 a 127, cuando se obtiene un objeto en ese rango regresara siempre el mismo valor.

Algo similar pasa con los tipos boolean, char y short:

If the value p being boxed is true, false, a byte, or a char in the range \u0000 to \u007f, or an int or short number between -128 and 127 (inclusive), then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7

Imagen de santos.r09

La respuesta estaba en el mismo Libro

Gracias Zamudio y Oscar, la respuesta estaba en el resumen del libro:
Boxing (Objective 3.1)
* As of Java 5, boxing allows you to convert primitives to wrappers or to
convert wrappers to primitives automatically.
* Using == with wrappers created through boxing is tricky; those with the same
small values (typically lower than 127), will be ==, larger values will not be ==.


Saludos.

A mi me parece más rápido

A mi me parece más rápido preguntar :P Aunque no siempre hay quien conteste, pero ahora si hubo.