A partir do Java 1.5, você pode muito bem intercâmbio Integer
com int
em muitas situações.
No entanto, encontrei um defeito em potencial no meu código que me surpreendeu um pouco.
O código a seguir:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
parecia estar definindo incorretamente incompatibilidade quando os valores eram iguais, embora não seja possível determinar em que circunstâncias. Eu defini um ponto de interrupção no Eclipse e vi que os Integer
valores eram ambos 137, e eu inspecionei a expressão booleana e ela disse que era falsa, mas quando eu a pisei, estava configurando incompatibilidade como true.
Alterando o condicional para:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
corrigiu o problema.
Alguém pode esclarecer por que isso aconteceu? Até agora, só vi o comportamento no meu host local no meu próprio PC. Nesse caso em particular, o código conseguiu passar por cerca de 20 comparações, mas falhou em 2. O problema era consistentemente reproduzível.
Se for um problema predominante, deve estar causando erros em nossos outros ambientes (dev e test), mas até agora, ninguém relatou o problema após centenas de testes executando esse trecho de código.
Ainda não é legítimo usar ==
para comparar dois Integer
valores?
Além de todas as boas respostas abaixo, o seguinte link stackoverflow possui algumas informações adicionais. Na verdade, ele teria respondido à minha pergunta original, mas como não mencionei o autoboxing na minha pergunta, ele não apareceu nas sugestões selecionadas:
Por que o compilador / JVM não pode simplesmente fazer com que a caixa automática funcione?
Você não pode comparar dois
Integer
com==
objetos simples , para que as referências na maioria das vezes não sejam as mesmas.Existe um truque:
Integer
entre -128 e 127, as referências serão as mesmas que os usos de caixa automáticaInteger.valueOf()
que armazenam em cache pequenos números inteiros.Recursos :
Sobre o mesmo tópico:
fonte
new Integer(1) == new Integer(1)
ainda é falso.new ... == new ...
é semprefalse
.equals()
ao lidar com objetos. Essa deve ser uma das primeiras coisas que se deve saber ao aprender Java. A propósito, eu teria imaginado que o construtor deInteger
era privado, ou seja, que as instâncias sempre foram criadas por meio dovalueOf()
método. Mas vejo que o construtor é público.O problema é que seus dois objetos Inteiros são apenas isso, objetos. Eles não correspondem porque você está comparando suas duas referências de objeto, não os valores contidos. Obviamente,
.equals
é substituído para fornecer uma comparação de valores em oposição a uma comparação de referência de objeto.fonte
Integer
refere-se à referência, ou seja, ao comparar referências, você está comparando se elas apontam para o mesmo objeto, não para valor. Portanto, o problema que você está vendo. A razão pela qual ele funciona tão bem comint
tipos simples é que desmarca o valor contido noInteger
.Posso acrescentar que, se você está fazendo o que está fazendo, por que ter a
if
declaração para começar?fonte
"==" sempre compare a localização da memória ou referências a objetos dos valores. O método equals sempre compara os valores. Mas igual também usa indiretamente o operador "==" para comparar os valores.
Inteiro usa o cache inteiro para armazenar os valores de -128 a +127. Se o operador == for usado para verificar se há valores entre -128 e 127, ele retornará true. para outros valores além desses valores, ele retorna false.
Consulte o link para obter informações adicionais
fonte
Além da correção do uso,
==
você pode apenas desmarcar um dosInteger
valores comparados antes de fazer a==
comparação, como:O segundo será automaticamente retirado da caixa de seleção (é claro que você deve verificar se há
null
primeiro).fonte
Além dessas ótimas respostas, o que aprendi é que:
fonte