2013-04-18 142 views
3

声明int的差异如下。什么是一个适合不同类型的原始类与包装类初始化

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

请注意,使用的情况下:我瞪大眼睛,发现第一次将创建原始int.Second是要进行自动装箱和三是要在内存中创建引用。

我要寻找一个场景时,我应该先用这清楚地说明,第二和第三类整数initialization.Does互换使用的是将有任何性能影响

谢谢回复。

+2

相关:[当使用包装类和原语类型](http://stackoverflow.com/questions/1570416/when-to-use-wrapper-class-and-primitive-type),[什么是拳击和拆箱,什么是折衷?](http://stackoverflow.com/questions/13055/what-is-boxing-and-unboxing-and-what-are-the-trade-offs),[New Integer vs valueOf](http://stackoverflow.com/questions/2974561/new-integer-vs-valueof)。 – 2013-04-18 04:31:56

回答

6

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

第二和第三种情况更有趣一些。第二个方式是用“拳”,实际上是相同的:

Integer i = Integer.valueOf(20); 

valueOf方法可以创建新的对象,或者它可能会返回一个参考先前存在的对象。 (事实上​​,JLS保证valueOf将缓存在-128 .. + 127范围内的号码Integer值...)

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

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

教训:使用.equals(...)来比较包装类型而不是==


在其中的问题使用方法:

  • 如果iint,使用第一种形式。
  • 如果iInteger,第二种形式最好......除非你需要一个对象是!=给其他实例。拳击(或明确呼吁valueOf)减少了小值的对象分配量,并且是一种有价值的优化。
+0

那么说,感谢您的回复 – 2013-04-18 04:43:07

+0

整数我等于int我在创作方面?整数我不是在堆内存中创建的?因为我有Short s = 20,当我比较Integer I == Short s时,它会给编译时间错误,但是当它的int i == Short时它是真的! @Stephen C – Gpar 2014-11-09 09:11:27

+0

@Gpar - 1)不清楚你在问什么2)不清楚你在问什么。 3)这不是一个问题。 – 2014-11-09 10:49:02

1

我能想到的一种情况是当您在Hibernate中映射数据库类型时。如果你使用Integer,你可以检查null(假设该列允许值为null)。如果你使用基元,并且如果数据库中的值为空,我想它会抛出一个错误。

3

基元在未分配时声明时将采用默认值。

但包装类是引用类型,所以没有分配他们将是null。这可能会导致NullPointerException在未分配的情况下使用。