首页 > 代码库 > 装箱与拆箱

装箱与拆箱

在Java 1.5发行版本中,引入了装箱拆箱的机制。也就是说,你可以在代码中将基本类型与装箱类型混用,比如int与Integer。

当你将基本类型赋值给装箱类型时,会自动进行装箱操作:

1 Integer i = 5;      <=>      Integer i = Integer.valueOf(5);

当你将装箱类型赋值给基本类型时,会自动进行拆箱操作:

1 int i = new Integer(5);     <=>     int i = (new Integer(5)).intValue();

在使用装箱机制时,会带来一些性能问题,比如下面这段代码,用于计算所有32位正整数的和:

1 Long sum = 0L;2 for (long i = 1; i <= Integer.MAX_VALUE; i++)3 {4     sum += i;5 }6         7 System.out.println(sum);

这段代码看上去没有问题,而且运行结果也是符合预期的,但是运行速度却慢的惊人。原因是每一次调用“sum += i”这行语句时,都会创建一个新的Long对象。所以整个循环总共创建了(231-1)个Long对象,而实际上这些对象都是多余的。将代码进行如下调整后,性能会提升很多:

1 long sum = 0L;2 for (long i = 1; i <= Integer.MAX_VALUE; i++)3 {4     sum += i;5 }6         7 System.out.println(sum);

由于sum是基本类型,所以在调用“sum += i”这行语句时,不会进行任何对象的创建。

虽然装箱与拆箱机制方便了代码的编写,但是建议不要默认使用这种机制。

装箱与拆箱