Galera, estou estudando pelo livro da Kathy - SCJP 5, mas quando vou realizar meus testes uso o JDK 6. No capítulo 3, onde fala de Boxing, a kathy coloca o seguinte código:
No entando quando coloco esse código para executar, como já dito, no JDK 6, o primeiro if não cai na condição VERDADEIRA, isso porque ele considera i1 igual a i2. Gostaria de saber se isso faz parte da atualização do jdk 5 para o 6… Grande abraço pessoal, falow…
Na primeira vez execute com o valor das variáveis igual a 1000, depois uma segunda vez, execute com valor das variáveis igual a 10…
vllw…
C
carlos.abreu
A JVM faz pool de objetos Integer, acredito q o range seja de -128 até 128. Ou seja, qdo a variável for 10 ele vai apontar para o mesmo objeto em memória.
[]´s
F
fenemeth
carlos.abreu:
A JVM faz pool de objetos Integer, acredito q o range seja de -128 até 128. Ou seja, qdo a variável for 10 ele vai apontar para o mesmo objeto em memória.
[]´s
Humm interessante, mas você poderia me dizer como funciona esse conceito de pool de objetos ??
abraçoow.
C
carlos.abreu
Seria mais ou menos o conceito de Pool q a JVM faz para Strings. Ela faz isso para economizar memória heap.
[]´s
F
fenemeth
carlos.abreu:
Seria mais ou menos o conceito de Pool q a JVM faz para Strings. Ela faz isso para economizar memória heap.
[]´s
Puts não me lembro como funciona esse conceito, darei uma olhada por ai…Grande abraço, falow.
F
fenemeth
Pesquisando aqui no forum achei uma resposta sobre o acontecimento citado por mim, vejam:
Quando você usa o recurso autoboxing (setando um valor primitivo ao tipo wrapper) você está implicitamente usando o método valueOf da classe Integer.
Ou seja,
é equivalente de
E por motivos de desempenho, como criar objetos chega a ser uma operação "caro" em termos de desempenho quando muitos objetos estão sendo criados, as classes wrapper utilizam esquemas para evitar criação de novos objetos.
Veja por exemplo o método valueOf(int) da classe Integer:
publicstaticIntegervalueOf(inti){finalintoffset=128;if(i>=-128&&i<=127){// must cache returnIntegerCache.cache[i+offset];}returnnewInteger(i);}
Agora, se você fizer o teste com um valor que está fora esse range (-128 => 127) vai ver que o resultado será diferente.
[]s,
Sami
Foxlol
Vish, essa eu não sabia! Tem que tomar cuidado com essas coisas no exame
T
thingol
Essas sutilezas não deveriam cair no exame (em inglês são chamadas de “corner cases”.) Na verdade são detalhes de implementação do JDK da Sun.
Outra coisa que já vi em certos simulados, e que não deve cair porque é um detalhe de implementação:
[i]
Diga quantos objetos String são criados na linha 2 de cada um dos códigos abaixo:
// Código 1Strings="abc";s=s.toUpperCase();
e neste código:
// Código 2Strings="ABC";s=s.toUpperCase();
[/i]
A resposta, surpreendentemente, é “1” para o código 1 e “0” para o código 2. Isso porque “toUpperCase()” não cria um novo objeto String no caso de a string original já ser em maiúsculas, mas isso é um detalhe de implementação da JVM da Sun. Obviamente isso não deve cair, porque poderia ser até implementado de forma diferente na JVM de outro licenciado da Sun.
F
fenemeth
Éeee pessoal, detalhezinhos sacanas esses. No entanto é bom saber que não cai esse nível de detalhe na prova…