13

自动装箱似乎归结为我可以写的事实:

Integer i = 0; 

代替:

Integer i = new Integer(0);

因此,编译器可以自动将原语转换为对象。

是这个主意吗?为什么这很重要?

4

9 回答 9

17

你有点过于简化了。

使用集合时,自动装箱也会发挥作用。正如 sun 的 java 文档中所解释的:

集合只能保存对象引用,因此您必须将原始值装箱到适当的包装类中。...当您从集合中取出对象时,您将获得放入的 Integer;如果需要 int,则必须使用 intValue 方法对 Integer 进行拆箱。所有这些装箱和拆箱都是一种痛苦,并且会使您的代码混乱。自动装箱和拆箱功能使过程自动化,消除了痛苦和混乱。

那么什么时候应该使用自动装箱和拆箱呢?仅当引用类型和原语之间存在“阻抗不匹配”时才使用它们,例如,当您必须将数值放入集合中时。对于科学计算或其他对性能敏感的数字代码,不适合使用自动装箱和拆箱。Integer 不能替代 int;自动装箱和拆箱模糊了原始类型和引用类型之间的区别,但它们并没有消除它。

自动装箱的伟大概述

于 2009-04-20T00:20:23.337 回答
10

顺便提一句

Integer i = 0;

相当于

Integer i = Integer.valueOf(0);

区别在于 valueOf() 不会为 -128 和 127 之间的值创建新对象(显然,如果 Java 6u14,这将是可调的)

于 2009-04-20T06:51:42.130 回答
5

它的存在是为了让您可以编写类似的代码

List<Integer> is = new ArrayList<Integer>();
is.add(1); // auto-boxing
is.add(2);
is.add(3);

int sum = 0;
for (int i : is)  // auto-unboxing
{
    sum += i;
}

对于单个整数,您应该默认使用 int 类型,而不是 Integer。整数主要用于集合。

请注意,Long 与 Integer 的值不同(使用 equals()),但 long 等于 int(使用 ==)。

于 2009-04-20T10:53:21.707 回答
3

就是这个想法,是的。不过,将 Integer 分配给 int 会更方便。

有人可能会争辩说,自动装箱解决的是症状而不是原因。混淆的真正根源在于 Java 的类型系统是不一致的:对原语和对象引用的需求是人为的和笨拙的。自动装箱在一定程度上缓解了这一点。

于 2009-04-20T00:24:22.000 回答
2

戴上我愤世嫉俗的帽子:弥补原始 Java(我指的是 Oak)规范的限制。不只是第一次。

于 2009-04-20T00:22:11.070 回答
1

使代码更易读、更整洁。特别是如果您正在执行操作(因为 Java 没有运算符重载)。

于 2009-04-20T00:19:03.137 回答
1

根据我在阅读 Joshua Bloch 的 Effective Java 时的记忆,您应该考虑原语而不是盒装对应物。不考虑副作用的自动装箱可能会产生问题。

于 2009-04-20T00:24:49.940 回答
1

添加到 Lim 的评论中,原语存储在堆栈中,而原语包装器作为对象存储在堆中......因此有一些微妙的含义。

于 2009-04-20T00:29:30.740 回答
1

主要优点是可读性,基本上是语法糖。Java 已经非常冗长,Sun 正在尝试各种方法来缩短语法。

于 2009-04-20T00:39:52.867 回答