原语vs包装类初始化

时间:2013-04-18 04:25:53

标签: java

将int声明为下面的区别是什么。哪种情况适合不同类型的使用

int i     = 20;
Integer i = 20;
Integer i = new Integer(20);

请注意:我已经goggled并且发现首先要创建原始int.Second将执行自动装箱,而Third将在内存中创建引用。

我正在寻找一个场景,清楚地解释我应该何时使用第一,第二和第三种整数初始化。交换使用情况会有任何性能点击

感谢回复。

3 个答案:

答案 0 :(得分:6)

第一种情况下的初始化是一个常量值的简单分配。没有什么有趣的......除了这是一个被分配的原始值,原始值没有“身份”;即int20的所有“副本”都相同。

第二和第三个案例更有趣。第二种形式是使用“拳击”,实际上相当于:

Integer i = Integer.valueOf(20);

valueOf方法可以创建一个新对象,或者它可以返回对先前存在的对象的引用。 (实际上,JLS保证valueOf将缓存-128 .. + 127 ...中数字的Integer值。)

相比之下new Integer(20) 总是创建一个新对象。

如果您习惯使用Integer比较==包装对象(或类似对象),那么对新对象(或不对)的这个问题很重要。在一种情况下,如果您比较两个“20”实例,==可能是true。在另一种情况下,保证为false

课程:使用.equals(...)比较不是==的包装类型。


关于使用哪个问题:

  • 如果iint,请使用第一个表单。
  • 如果iInteger,则第二种形式最好......除非您需要与其他实例!=的对象。 Boxing(或显式调用valueOf)减少了小值的对象分配量,值得进行优化。

答案 1 :(得分:3)

在没有赋值的情况下声明时,基元将采用默认值。

但是包装类是引用类型,因此如果没有赋值,它们将是null。如果在没有分配的情况下使用,可能会导致NullPointerException被抛出。

答案 2 :(得分:1)

我能想到的一个这样的场景是在Hibernate中映射数据库类型时。如果使用Integer,则可以检查null(假设列允许null值)。如果使用原语,如果数据库中的值为null,我猜它会引发错误。