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?
publicclassteste{publicstaticvoidmain(String[]args){Integera=200;Integerb=200;Integerc=10;Integerd=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");}}}
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!
henriquedamota
Então cara, queria saber porque que o valor do Integer ta influindo.
To no aguardo de algum sábio ai! =]
abraços Valeu!
A
Arnaldo_Caetano
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!
leobessa
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.