Auto-boxing ou auto-unboxing?

6 respostas
E

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

R
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.");
    }
}
E
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.

R

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

V

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.

E
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?

V

Correto. O objeto fará auto-unboxing.

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