class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
Resultado:
false
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
Resultado:
true
Nota: Números entre -128 e 127 são verdadeiros.
java
integer
comparison
pass-by-reference
pass-by-value
vipin k.
fonte
fonte
Respostas:
Quando você compila um literal numérico em Java e o atribui a um número inteiro (capital
I
), o compilador emite: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:
O valor de
high
pode ser configurado para outro valor, com a propriedade do sistema.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:
fonte
false
. Na verdade, isso já pode acontecer hoje, como efeito colateral da aplicação da Análise de escape e da substituição escalar.A autoboxing armazena em cache -128 a 127. Isso é especificado no JLS ( 5.1.7 ).
Uma regra simples a ser lembrada ao lidar com objetos é - use
.equals
se você deseja verificar se os dois objetos são "iguais", use==
quando quiser ver se eles apontam para a mesma instância.fonte
O uso de tipos de dados primitivos, ints, produziria true em ambos os casos, a saída esperada.
No entanto, como você está usando objetos Inteiros, o operador == tem um significado diferente.
No contexto de objetos, == verifica se as variáveis se referem à mesma referência de objeto.
Para comparar o valor dos objetos, você deve usar o método equals ()
que indicará se b2 é menor que b1, maior que ou igual a (verifique a API para obter detalhes)
fonte
É otimização de memória relacionada a Java.
fonte
Dê uma olhada no Integer.java, se o valor estiver entre -128 e 127, ele usará o pool em cache, portanto,
(Integer) 1 == (Integer) 1
enquanto(Integer) 222 != (Integer) 222
fonte
Outras respostas descrevem por que os efeitos observados podem ser observados, mas isso não vem ao caso para programadores (interessante, certamente, mas algo que você deve esquecer ao escrever código real).
Para comparar objetos Inteiros para igualdade, use o
equals
métodoNão tente comparar objetos Inteiros para igualdade usando o operador de identidade
==
,.Pode acontecer que alguns valores iguais sejam objetos idênticos, mas isso não é algo em que geralmente se deve confiar.
fonte
Eu escrevi o seguinte, pois esse problema não é apenas específico para Inteiro. Minha conclusão é que, na maioria das vezes, se você usar a API incorretamente, verá um comportamento incorreto. Use-o corretamente e você verá o comportamento correto:
fonte