Quando você compila um literal numérico em Java e o atribui a um número inteiro (capital I
), o compilador emite:
Integer b2 =Integer.valueOf(127)
Essa linha de código também é gerada quando você usa a caixa automática.
valueOf
é implementado de forma que certos números sejam "agrupados" e retorna a mesma instância para valores menores que 128.
No código-fonte java 1.6, linha 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
O valor de high
pode ser configurado para outro valor, com a propriedade do sistema.
-Djava.lang.Integer.IntegerCache.high = 999
Se você executar o seu programa com essa propriedade do sistema, o resultado será verdadeiro!
A conclusão óbvia: nunca confie em duas referências idênticas, sempre as compare com o .equals()
método.
Portanto, b2.equals(b3)
será impresso true para todos os valores logicamente iguais de b2, b3.
Observe que o Integer
cache não existe por motivos de desempenho, mas para estar em conformidade com o JLS, seção 5.1.7 ; a identidade do objeto deve ser fornecida para os valores -128 a 127 inclusive.
O número inteiro # valueOf (int) também documenta esse comportamento:
é provável que esse método produza desempenho de espaço e tempo significativamente melhor armazenando em cache os valores solicitados com freqüência. Este método sempre armazenará em cache valores no intervalo -128 a 127, inclusive, e poderá armazenar em cache outros valores fora desse intervalo.