Integers e ints

Fala pessoal, podem me ajudar?

class test { public static void main(String[] args) { test inst_test = new test(); int i1 = 2000; int i2 = 2000; int i3 = 2; int i4 = 2; Integer Ithree = new Integer(2); // 1 Integer Ifour = new Integer(2); // 2 System.out.println( Ithree == Ifour ); inst_test.method( i3 , i4 ); inst_test.method( i1 , i2 ); } public void method( Integer i , Integer eye ) { System.out.println(i == eye ); } }

A- true false true
B- false true false
C- false false false
D- true true false
E- Complie error

tenho como resposta certa B, mas acho que está errado!
Peguei essa questão do Inquisition - John Meyers.

Obrigado

Lembre-se que == compara referências, não valores.

Dois Integers só serão == um ao outro se se referirem ao mesmo objeto.

Deve ser pq os Wrappers (Integer) só podem ser comparados com equals como Strings.

Ai sim tem a resposta

E esse trecho???

inst_test.method( i3 , i4 ); inst_test.method( i1 , i2 );

Não deveria dar:
true true
ou
false false ???

[quote=guilherme.cq]E esse trecho???

inst_test.method( i3 , i4 ); inst_test.method( i1 , i2 );

Não deveria dar:
true true
ou
false false ???[/quote]

Bem isso que eu analisei, por eliminação só tem um false false, a letra C

eu rodeio o código e realmente a resposta é false true false

Não entendi pq a comparação de i1 com i2 retorna false

Alguem pode explicar?

bom…talvez eu possa dar o meu pitaco, mesmo sem ter muita certeza em relação ao final…

começando vamos aos principios basicos da pergunta:

== comparando objetos verifica se são o mesmo objeto, comparando tipos primitivos verifica se o valor das variaveis de tipos primitivos é o mesmo… (para se comparar equivalencia entre objetos deve-se usar o equals)

quando vc mandaum int para um metodo que exige um Integer, o int é convertido para um Integer em tempo de execução (isso se chama auto-boxing)


ok… agora vamos pensar um pouco, a primeira coisa a ser feita, foi ter comparado dois objetos com o == ,ambos foram criados dando um new Integer, por isso em cada um foi criado um objeto novo, sendo objetos diferentes na memoria, sendo assim essa primeira comparação ja da false.

depois foram enviados dois ints pro metodo e eles foram convertidos em dois Integers (dois integers, diferentes e não duas referencias a um integer que vale 2), sendo assim vai da false tb… e idem a linha seguinte…

sendo assim false false false…

importante pra quem vai tenta o exame
uma dica que posso da pra quem for tenta o exame, é tenta ter um pinguinho de malandragem tb pra eliminar possibilidades, veja o segundo e o terceiro boolean impressos, em ambos os casos foram enviados dois ints iguais, foram convertidos para Integers e depois comparados… se um der false o outro tem que da false tb, se um da true o outro tb tem que da true… (isso elimina a opção B)

ps do erro de digitação, falto o underline na linha 11, mais nao acho que seja proposital por isso eu nao iria na ultima opção…

edit… fui etsta aki e falei bestera mesmo…

[quote=maior_abandonado]bom…talvez eu possa dar o meu pitaco, mesmo sem ter muita certeza em relação ao final…

começando vamos aos principios basicos da pergunta:

== comparando objetos verifica se são o mesmo objeto, comparando tipos primitivos verifica se o valor das variaveis de tipos primitivos é o mesmo… (para se comparar equivalencia entre objetos deve-se usar o equals)

quando vc mandaum int para um metodo que exige um Integer, o int é convertido para um Integer em tempo de execução (isso se chama auto-boxing)


ok… agora vamos pensar um pouco, a primeira coisa a ser feita, foi ter comparado dois objetos com o == ,ambos foram criados dando um new Integer, por isso em cada um foi criado um objeto novo, sendo objetos diferentes na memoria, sendo assim essa primeira comparação ja da false.

depois foram enviados dois ints pro metodo e eles foram convertidos em dois Integers (dois integers, diferentes e não duas referencias a um integer que vale 2), sendo assim vai da false tb… e idem a linha seguinte…

sendo assim false false false…

importante pra quem vai tenta o exame
uma dica que posso da pra quem for tenta o exame, é tenta ter um pinguinho de malandragem tb pra eliminar possibilidades, veja o segundo e o terceiro boolean impressos, em ambos os casos foram enviados dois ints iguais, foram convertidos para Integers e depois comparados… se um der false o outro tem que da false tb, se um da true o outro tb tem que da true… (isso elimina a opção B)

ps do erro de digitação, falto o underline na linha 11, mais nao acho que seja proposital por isso eu nao iria na ultima opção…[/quote]

errado, a resposta correta é a B (false true false)

já compilei e rodei e da isso mesmo.

Pela sua explicação a resposta seria false false false, mas NÃO é.

A dúvida está por que o i1 e i2 dão false sendo que i3 e i4 dão true

Esse tipo de coisa (saber que o autoboxing cria novos objetos se o inteiro for < -128 ou > 127), que é o que esta questão mal-escrita cobra, é um detalhe de implementação, tanto é que no Java 6 Update 14 você vai poder mudar esse intervalo como um parâmetro da JVM. ( http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6807702 )

Essa questão não pode cair dessa maneira, porque é um comportamento que não está documentado no Javadoc.

De qualquer maneira, vou explicar o que ocorreu nos comentários abaixo.

 class test {  
    public static void main(String[] args) {  
       test inst_test = new test();  
       int i1 = 2000;  
       int i2 = 2000;  
       int i3 = 2;  
       int i4 = 2;  
       Integer Ithree = new Integer(2); // 1  
       Integer Ifour = new Integer(2); // 2  
       // Comparando 2 objetos &quot;novos&quot;, criados com new Integer:
       System.out.println( Ithree == Ifour );  // false
       // Comparando 2 objetos criados com autoboxing, que usa Integer.valueOf.
       // Integer.valueOf pega um objeto pré-criado (do cache) se -128 &lt;= x &lt;= 127, e
       // cria um objeto novo com new Integer em caso contrário.
       // Nesse caso, i3 e i4 são o mesmo objeto Integer, que está no cache.
       inst_test.method( i3 , i4 );  // true
       // Como 2000 está fora do intervalo -128, +127 então são criados 2 objetos novos;
       // eles não são obtidos do cache.
       inst_test.method( i1 , i2 );  // false
    }  
    public void method( Integer i , Integer eye ) {  
       System.out.println(i == eye );  
    }  
 } 

Agora sim a pergunta foi respondida

Valeu thingol

Puxa!!! Nõa sabia disso…

thingol é uma bibliioteca ambulante… sabe coisas que nem estão no javadoc rsrsr