Autoboxing:所以我可以写:Integer i = 0;而不是:Integer i = new Integer(0);

时间:2009-04-20 00:16:02

标签: java autoboxing

Autoboxing似乎归结为我可以写的事实:

Integer i = 0; 

而不是:

Integer i = new Integer(0);

因此,编译器可以自动将基元转换为Object。

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

9 个答案:

答案 0 :(得分:16)

你有点过分简化它。

使用集合时,Autoboxing也会发挥作用。正如sun的java文档中所解释的那样:

  

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

     

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

Great overview of Autoboxing

答案 1 :(得分:8)

顺便说一句

Integer i = 0;

相当于

Integer i = Integer.valueOf(0);

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

答案 2 :(得分: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()),但是长度等于int(使用==)。

答案 3 :(得分:3)

这就是想法,是的。但是,能够将Integer分配给int更方便。

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

用我的愤世嫉俗的帽子:弥补原始Java的限制(我的意思是这里的橡木)规范。不只是第一次。

答案 6 :(得分:1)

从我记得阅读Joshua Bloch的Effective Java时,你应该考虑它们的盒装对应物的基元。自动装箱而不考虑其副作用会产生问题。

答案 7 :(得分:1)

添加到Lim的注释中,原语存储在堆栈中,原始包装器(作为对象)存储在堆上......由于这个原因,有一些微妙的含义。

答案 8 :(得分:1)

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