原始类与包装类初始化
声明int的差异如下。什么是一个适合不同类型的原始类与包装类初始化
int i = 20;
Integer i = 20;
Integer i = new Integer(20);
请注意,使用的情况下:我瞪大眼睛,发现第一次将创建原始int.Second是要进行自动装箱和三是要在内存中创建引用。
我要寻找一个场景时,我应该先用这清楚地说明,第二和第三类整数initialization.Does互换使用的是将有任何性能影响
谢谢回复。
第一种情况下的初始化是一个简单的常量值赋值。没有什么有趣的...除了这是一个正在分配的原始值,原始值没有“身份”。即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
,第二种形式最好......除非你需要一个对象是!=
给其他实例。拳击(或明确呼吁valueOf
)减少了小值的对象分配量,并且是一种有价值的优化。
那么说,感谢您的回复 – 2013-04-18 04:43:07
整数我等于int我在创作方面?整数我不是在堆内存中创建的?因为我有Short s = 20,当我比较Integer I == Short s时,它会给编译时间错误,但是当它的int i == Short时它是真的! @Stephen C – Gpar 2014-11-09 09:11:27
@Gpar - 1)不清楚你在问什么2)不清楚你在问什么。 3)这不是一个问题。 – 2014-11-09 10:49:02
我能想到的一种情况是当您在Hibernate
中映射数据库类型时。如果你使用Integer,你可以检查null(假设该列允许值为null
)。如果你使用基元,并且如果数据库中的值为空,我想它会抛出一个错误。
基元在未分配时声明时将采用默认值。
但包装类是引用类型,所以没有分配他们将是null
。这可能会导致NullPointerException
在未分配的情况下使用。
相关:[当使用包装类和原语类型](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