声明int的方式有什么区别?哪些情况适用于不同类型的使用
int i = 20;
Integer i = 20;
Integer i = new Integer(20);
请注意:我通过谷歌搜索发现,第一种方式将创建原始整数。第二种方式将进行自动装箱,第三种方式将在内存中创建引用。
我正在寻找一个场景,清楚地解释何时应该使用第一种、第二种和第三种整数初始化方式。交换使用方式是否会对性能产生影响?
谢谢回复。
声明int的方式有什么区别?哪些情况适用于不同类型的使用
int i = 20;
Integer i = 20;
Integer i = new Integer(20);
第一种情况中的初始化是将一个常量值简单赋值。 没有什么有趣的地方...除了这是一个被赋值的原始值,原始值没有“身份”; 也就是说所有的int
值20
的“副本”都是相同的。
第二种和第三种情况有点更有趣。第二种形式使用“装箱”,实际上相当于这个:
Integer i = Integer.valueOf(20);
valueOf
方法可能会创建一个新对象,也可能返回对先前已存在的对象的引用。(事实上,JLS保证valueOf
将缓存在范围为 -128..+127 的数字的Integer
值。) 相比之下,new Integer(20)
总是创建一个新对象。==
来比较Integer
包装对象(或类似对象)。在一种情况下,如果你比较“20”的两个实例,==
可能是true
。在另一种情况下,则保证为false
。.equals(...)
来比较包装类型而不是==
。valueOf
)减少了小数值对象分配的数量,是一种值得优化的方式。当未分配时,基本类型将采用默认值。
但是包装类是引用类型,因此如果没有分配,它们将为null
。这可能会导致在使用时抛出NullPointerException
。
Hibernate
中的数据库类型时。如果您使用Integer,您可以检查null(假设列允许null
值)。如果您使用原始类型并且数据库中的值为null,则会抛出错误。