Boxing

Por que a comparação de wrappers usando == para valores abaixo de 128 é true e acima disso é false ?

        Integer i1 = 127;
        Integer i2 = 127;
        Integer i3 = 128;
        Integer i4 = 128;
        
        System.out.println((i1==i2)); // imprime true
        System.out.println((i3==i4)); // imprime false

[Editado]
SDK 5

Isso não cai em provas, mas para quem quer saber a resposta:

  • Os elementos de -128 a +127 já são pré-criados pela classe Integer e estão disponíveis via Integer.valueOf(int). Se o valor for < -128 ou > 127, Integer.valueOf(int) simplesmente chama new Integer e cria um novo objeto.
    O autoboxing é uma forma disfarçada de chamar Integer.valueOf(int).