Boxing Java 6

11 respostas
F

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:

Integer i1 = 1000;
Integer i2 = 1000;


if(i1 != i2) System.out.println("different objects");

if(i1.equals(i2)) System.out.println("meaningfully equal");

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…

11 Respostas

T

Rodei seu programa e ele imprime a mesma coisa no Java 5.0 e 6.0.
Ele sempre imprime, compilando com o 5.0 ou o 6.0 e rodando com o 5.0 ou 6.0:

different objects
meaningfully equal
class Teste {
    public static void main(String[] args) {
        Integer i1 = 1000;
        Integer i2 = 1000;
        if(i1 != i2) 
            System.out.println("different objects");
        if(i1.equals(i2))
            System.out.println("meaningfully equal");
    }
}

De onde você tirou que ele dá resultados diferentes no JDK 5 e 6?

B

Estranho aqui funciona normal, tanto rodando como 5 ou 6.

public class TestaInteger
{
    public static void main(String[] args)
    {
        Integer i1 = 1000;
        Integer i2 = 1000;
        
        if (i1 == i2)
            System.out.println("Objetos iguais.");
        
        if (i1.equals(i2))
            System.out.println("Valores iguais.");
    }
}
Imprime "Valores iguais."
F

Meu, ta muito estranho isso, execute, por favor o seguinte código então:

public static void main(String[] args) {
       
   Integer i1 = 1000;
   Integer i2= 1000;
   
   if(i1 !=  i2)
    System.out.println("Diferentes objetos");
   
   if(i1 == i2)
    System.out.println("Objetos Iguais");
   
   if(i1.equals(i2))
    System.out.println("Conteúdo igual");
   
   
        
    }

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

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

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

Seria mais ou menos o conceito de Pool q a JVM faz para Strings. Ela faz isso para economizar memória heap.

[]´s

F

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

Pesquisando aqui no forum achei uma resposta sobre o acontecimento citado por mim, vejam:

Tópico: http://www.guj.com.br/posts/list/66620.java#350734

Sami Koivu:
Complementando mais um pouquinho:

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:

public static Integer valueOf(int i) {
	final int offset = 128;
	if (i &gt= -128 && i &lt= 127) { // must cache 
	    return IntegerCache.cache[i + offset];
	}
        return new Integer(i);
    }

Agora, se você fizer o teste com um valor que está fora esse range (-128 =&gt 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 :smiley:

T

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 1
String s = "abc";
s = s.toUpperCase();

e neste código:

// Código 2
String s = "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

Éeee pessoal, detalhezinhos sacanas esses. No entanto é bom saber que não cai esse nível de detalhe na prova…

Abraço galera, falows.

Criado 21 de maio de 2008
Ultima resposta 28 de mai. de 2008
Respostas 11
Participantes 5