3

如下声明 int 有什么区别。哪些情况适合不同类型的使用

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

请注意:我仔细观察,发现 first 将创建原始 int。Second 将执行自动装箱,Third 将在内存中创建引用。

我正在寻找一个场景,它清楚地解释了我应该何时使用第一种、第二种和第三种整数初始化。互换使用是否会对性能产生任何影响

谢谢您的回复。

4

3 回答 3

6

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

第二种和第三种情况更有趣一些。第二种形式是使用“拳击”,实际上相当于:

Integer i = Integer.valueOf(20);

valueOf方法可以创建一个新对象,也可以返回对先前存在的对象的引用。(事实上​​,JLS 保证valueOf将缓存Integer-128..+127 ...范围内的数字值)

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

如果您习惯于Integer使用==. 在一种情况下==true如果您比较“20”的两个实例。在另一种情况下,它保证是false

教训:用于.equals(...)比较包装器类型 not ==


关于使用哪个的问题:

  • 如果iint,请使用第一种形式。
  • 如果iInteger,则第二种形式是最好的……除非您需要一个!=指向其他实例的对象。装箱(或显式调用valueOf)减少了小值的对象分配量,是值得优化的。
于 2013-04-18T04:36:03.833 回答
3

在没有赋值的情况下声明原语将采用默认值。

但是包装类是引用类型,所以没有赋值它们将是null. NullPointerException如果在没有赋值的情况下使用,这可能会导致抛出 a 。

于 2013-04-18T04:35:31.843 回答
1

我能想到的一种情况是当您在Hibernate. 如果您使用 Integer ,则可以检查 null (假设该列允许null值)。如果您使用原语并且数据库中的值为空,我猜它会引发错误。

于 2013-04-18T04:33:32.273 回答