Auto-boxing ou auto-unboxing?

6 respostas
ECO2004

Eu vou explicar a dúvida com um exemplo.

double a = 1.2;
   Double b = 1.2; //pelo exemplo abaixo, vê-se que b sofre auto-unboxing.
		
   System.out.println(a==b?"\"b\" sofreu auto-unboxing.": "\"a\" sofreu autoboxing");
		
   System.out.println(b==a?"\"b\" sofreu auto-boxing.": "\"a\" sofreu auto-unboxing");

Na comparação de um double com um Double (serve para Integer e int e demais), eu quero saber o que está acontecendo na comparação. Ao comparar um double com um Double (double == Double), o primeiro sofre autoboxing e as referências dos dois objetos são comparados, ou o segundo sofre auto-unboxing, ocorrendo uma comparação de valores? Eu verifiquei com o programa acima que o lado direito da comparação é quem sempre sofre a ação, autoboxing ou auto-unboxing. Lembrando que não existe pool de Doubles, assim, se a igualdade for verdadeira (primeira impressão), a única forma de isso ter acontecido é b ter sofrido um auto-unboxing. Se o contrário tivesse acontecido, teríamos dois objetos Double com suas referências sendo comparadas. Isso seria falso, pois teríamos dois objetos Double diferentes.

Alguém pode me confirmar isso? Às vezes posso estar deixando algum conceito passar…

Wilson

6 Respostas

Rodrigo_Sasaki
Descompilando com o JD
import java.io.PrintStream;

public class Teste
{
  public static void main(String[] args)
  {
    double a = 1.2D;
    Double b = Double.valueOf(1.2D);

    System.out.println(a == b.doubleValue() ? "\"b\" sofreu auto-unboxing." : "\"a\" sofreu autoboxing");

    System.out.println(b.doubleValue() == a ? "\"b\" sofreu auto-boxing." : "\"a\" sofreu auto-unboxing");
  }
}
Descompilando com o Cavaj
import java.io.PrintStream;

public class Teste
{

    public Teste()
    {
    }

    public static void main(String args[])
    {
        double a = 1.2D;
        Double b = Double.valueOf(1.2D);
        System.out.println(a != b.doubleValue() ? "\"a\" sofreu autoboxing" : "\"b\" sofreu auto-unboxing.");
        System.out.println(b.doubleValue() != a ? "\"a\" sofreu auto-unboxing" : "\"b\" sofreu auto-boxing.");
    }
}
ECO2004
Rodrigo Sasaki:
Descompilando com o JD
import java.io.PrintStream;

public class Teste
{
  public static void main(String[] args)
  {
    double a = 1.2D;
    Double b = Double.valueOf(1.2D);

    System.out.println(a == b.doubleValue() ? "\"b\" sofreu auto-unboxing." : "\"a\" sofreu autoboxing");

    System.out.println(b.doubleValue() == a ? "\"b\" sofreu auto-boxing." : "\"a\" sofreu auto-unboxing");
  }
}
Descompilando com o Cavaj
import java.io.PrintStream;

public class Teste
{

    public Teste()
    {
    }

    public static void main(String args[])
    {
        double a = 1.2D;
        Double b = Double.valueOf(1.2D);
        System.out.println(a != b.doubleValue() ? "\"a\" sofreu autoboxing" : "\"b\" sofreu auto-unboxing.");
        System.out.println(b.doubleValue() != a ? "\"a\" sofreu auto-unboxing" : "\"b\" sofreu auto-boxing.");
    }
}

O programa sempre está comparando um double com um double...não tem boxing. Não entendi como ele me ajuda.

Rodrigo_Sasaki

Suas Strings estão te confundindo, na segunda expressão você deixou assim:System.out.println(b==a?"\"b\" sofreu auto-boxing.": "\"a\" sofreu auto-unboxing");Só que “B” nunca vai sofrer Boxing, sempre Unboxing. Se você corrigir as Strings vai ter o resultado apropriado. Resumindo, é sempre “b” que sofre unboxing nos seus exemplos

ViniGodoy

Ele te ajuda justamente pelo fato de normalmente, numa comparação assim, você querer comparar valores, e não referências. Até pq, não existe referência num tipo primitivo.

ECO2004
double a = 1.2;
   Double b = 1.2; //pelo exemplo abaixo, vê-se que b sofre auto-unboxing.
		
   System.out.println(a==b?"\"b\" sofreu auto-unboxing.":"\"a\" sofreu autoboxing");
		
   System.out.println(b==a?"\"b\" sofreu auto-unboxing.":	"\"a\" sofreu auto-boxing");

Olhe a impressão do programa:

"b" sofreu auto-unboxing.
"b" sofreu auto-unboxing.

Eu corrigi…

É isso que eu queria saber: sempre que eu estiver comparando um objeto wrapper (Integer, Double…) com algum tipo primitivo (respectivo), sempre o objeto que sofre auto-unboxing, e nunca o primitivo sofre auto-boxing, correto?

ViniGodoy

Correto. O objeto fará auto-unboxing.

Criado 19 de março de 2013
Ultima resposta 19 de mar. de 2013
Respostas 6
Participantes 3