Java 原语与包装类初始化

Java 原语与包装类初始化,java,Java,下面声明int的区别是什么。哪些情况适合不同类型的使用 int i = 20; Integer i = 20; Integer i = new Integer(20); 请注意:我目不转睛地看了看,发现第一个将创建基元int。第二个将执行自动装箱,第三个将在内存中创建引用 我正在寻找一个场景,它清楚地解释了我应该在什么时候使用第一、第二和第三种整数初始化 谢谢你的回复 我能想到的一种情况是在Hibernate中映射DB类型。如果使用Integer,则可以检查null(假设列允许null

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

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
    )可以减少小值的对象分配量,是一种值得优化的方法

相关:,。非常感谢您的回复。整数I在创建方面是否等于整数I?整数I是否不会在堆内存中创建?因为我得到了Short s=20,当我比较整数I==Short s时,它会给出编译时错误,但当它的int I==Short s时,它是真的@史蒂芬C@Gpar-1)不清楚你在问什么2)不清楚你在问什么。3) 这不是一个问题。@Gpar-提示:如果你想得到问题的正确答案,那么:1)搜索StackOverflow,看看他们是否已经被提问和回答,然后2)花时间写一个正确的问题。