Java 原语与包装类初始化
下面声明int的区别是什么。哪些情况适合不同类型的使用Java 原语与包装类初始化,java,Java,下面声明int的区别是什么。哪些情况适合不同类型的使用 int i = 20; Integer i = 20; Integer i = new Integer(20); 请注意:我目不转睛地看了看,发现第一个将创建基元int。第二个将执行自动装箱,第三个将在内存中创建引用 我正在寻找一个场景,它清楚地解释了我应该在什么时候使用第一、第二和第三种整数初始化 谢谢你的回复 我能想到的一种情况是在Hibernate中映射DB类型。如果使用Integer,则可以检查null(假设列允许null
int i = 20;
Integer i = 20;
Integer i = new Integer(20);
请注意:我目不转睛地看了看,发现第一个将创建基元int。第二个将执行自动装箱,第三个将在内存中创建引用
我正在寻找一个场景,它清楚地解释了我应该在什么时候使用第一、第二和第三种整数初始化
谢谢你的回复 我能想到的一种情况是在
Hibernate
中映射DB类型。如果使用Integer,则可以检查null(假设列允许null
值)。如果使用原语,并且数据库中的值为null,我猜它会抛出一个错误。原语在未赋值的情况下声明时将采用默认值
但是包装器类是引用类型,所以如果不赋值,它们将是
null
。这可能会导致在未赋值的情况下使用时抛出NullPointerException
。第一种情况下的初始化是一个简单的常量赋值。没什么有趣的。。。除了这是一个正在赋值的原语值,并且原语值没有“标识”;i、 e.int
值20
的所有“副本”均相同
第二个和第三个案例更有趣。第二种形式使用“拳击”,实际上相当于:
Integer i = Integer.valueOf(20);
该方法可以创建新对象,也可以返回对以前存在的对象的引用。(事实上,JLS保证valueOf
将缓存范围为-128..+127
相比之下,新整数(20)
总是创建一个新对象
如果您习惯于使用=
比较Integer
包装器对象(或类似对象),则新对象(或否)的此问题很重要。在一种情况下,如果您比较“20”的两个实例,则==
可能是true
。在另一种情况下,它保证为false
课程:使用.equals(…)
比较包装类型而不是=
关于使用哪种方法的问题:
- 如果
为i
,则使用第一种形式int
- 如果
是i
,则第二种形式最好。。。除非您需要的对象是Integer
=代码>到其他实例。装箱(或显式调用
)可以减少小值的对象分配量,是一种值得优化的方法valueOf