[RESOLVIDO] Ajuda com o resultado do código

[code]public static void main(String[] args) {
Integer inteiro = 90;
Integer outroInteiro = 90;

	System.out.println(inteiro != outroInteiro);
	System.out.println(inteiro == outroInteiro);

	Integer i1 = 129;
	Integer i2 = 129;

	System.out.println(i1 != i2);
	System.out.println(i1 == i2);
} // main[/code]

Resultado:

false
true
true
false

Tava reparando que o resultado dessa comparação usando a classe Integer com valores que poderiam ser colocados em Byte, gera um resultado que pareceu bem estranho. As mesmas condições usando valores a cima de byte não dá o mesmo resultado, e nem usando classes wrapper diferentes. Alguém sabe explicar o que tá acontecendo ?

O java tem um cache de inteiros, de números no range de um byte. Sempre que vc faz:

Integer x = 90;

O java converte pra

Integer x = Integer.valueOf(90);

O método valueOf faz o seguinte:

  1. SE o objeto está nesse cache, retorna o objeto do cache;
  2. Caso contrário cria um novo integer com o valor.

Portanto, números no range de um byte irão retornar true no ==, pois se tratam do mesmo objeto, a mesma referência. Números fora desse range retornam objetos diferentes, portanto, o == retorna false. Por isso o certo é fazer testes de objetos usando equals.