将int声明为下面的区别是什么。哪种情况适合不同类型的使用
int i = 20;
Integer i = 20;
Integer i = new Integer(20);
请注意:我已经goggled并且发现首先要创建原始int.Second将执行自动装箱,而Third将在内存中创建引用。
我正在寻找一个场景,清楚地解释我应该何时使用第一,第二和第三种整数初始化。交换使用情况会有任何性能点击
感谢回复。
答案 0 :(得分:6)
第一种情况下的初始化是一个常量值的简单分配。没有什么有趣的......除了这是一个被分配的原始值,原始值没有“身份”;即int
值20
的所有“副本”都相同。
第二和第三个案例更有趣。第二种形式是使用“拳击”,实际上相当于:
Integer i = Integer.valueOf(20);
valueOf
方法可以创建一个新对象,或者它可以返回对先前存在的对象的引用。 (实际上,JLS保证valueOf
将缓存-128 .. + 127 ...中数字的Integer
值。)
相比之下new Integer(20)
总是创建一个新对象。
如果您习惯使用Integer
比较==
包装对象(或类似对象),那么对新对象(或不对)的这个问题很重要。在一种情况下,如果您比较两个“20”实例,==
可能是true
。在另一种情况下,保证为false
。
课程:使用.equals(...)
比较不是==
的包装类型。
关于使用哪个问题:
i
为int
,请使用第一个表单。i
是Integer
,则第二种形式最好......除非您需要与其他实例!=
的对象。 Boxing(或显式调用valueOf
)减少了小值的对象分配量,值得进行优化。答案 1 :(得分:3)
在没有赋值的情况下声明时,基元将采用默认值。
但是包装类是引用类型,因此如果没有赋值,它们将是null
。如果在没有分配的情况下使用,可能会导致NullPointerException
被抛出。
答案 2 :(得分:1)
我能想到的一个这样的场景是在Hibernate
中映射数据库类型时。如果使用Integer,则可以检查null(假设列允许null
值)。如果使用原语,如果数据库中的值为null,我猜它会引发错误。