Dúvida com Integer == Integer

Boa noite…

estou lendo o livro da kathys sierra (scpj 5) e quis fazer o teste na minha máquina.

Porque o código abaixo produz a seguinte saída?

public class teste {

	public static void main(String[] args) {
		Integer a = 200;
		Integer b = 200;
		Integer c = 10;
		Integer d = 10;
		
		if(a == b){
			System.out.println("a e b iguais");
		}
		if(a != b){
			System.out.println("a e b diferentes");
		}
		if(c == d){
			System.out.println("c e d iguais");
		}
		if(c != d){
			System.out.println("c e d diferentes");
		}
	}
}

Resultado:
a e b diferentes
c e d iguais

Porra sinistro… Eu realmente n sei, como vc sou novato e estou muito curioso…

Agora eu fiz um teste e tipei as variaveis com o tipo primitivo int e deu certo… Parece que é alguma coisa com a classe Integer…

Vamos aguardar pra ver se alguém ajuda…

Abraços!

Então cara, queria saber porque que o valor do Integer ta influindo.

To no aguardo de algum sábio ai! =]

abraços Valeu!

No Java, os números que cabem no range do tipo byte (-128 a 127) apontam para o mesmo local na pilha, enquanto que valores superiores ao valores que cabem em 1 tipo byte são armazenados na pilha em lugares diferentes. Repare que o autoboxing do java está colocando o literal 200 em um objeto do tipo Integer, quando a é comparado com b estamos comparando referências que apontam para lugares diferentes. Integers acima do range de 1 byte deveriam ser comparados com equals, a.equals(b)!

Espero ter esclarecido!

Olá Henrique e Fernando,

isto acontece por que a máquina virtual pode utilizar um pool de objetos para obter otimizações.

No caso de Integer’s, os objetos que estão entre -128 a 127 são armazenados no pool (quando declarados da forma literal, ou seja, sem o new). Tome cuidado pois esse pool é um recurso da maquina virtual da Sun, e existe a possibilidade de máquinas virtuais de outros fornecedores não utilizarem um pool neste caso.

De uma olhada nos links abaixo para saber mais:


http://www.owasp.org/index.php/Java_gotchas

Espero ter ajudado com sua dúvida.

Muito Obrigado pelas respostas! Consegui entender sim!

Um abraço!
Henrique

Vlw galera!! Obrigado pela dica!