原始类型与包装类的初始化

3

声明int的方式有什么区别?哪些情况适用于不同类型的使用

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

请注意:我通过谷歌搜索发现,第一种方式将创建原始整数。第二种方式将进行自动装箱,第三种方式将在内存中创建引用。
我正在寻找一个场景,清楚地解释何时应该使用第一种、第二种和第三种整数初始化方式。交换使用方式是否会对性能产生影响?
谢谢回复。

3个回答

6

第一种情况中的初始化是将一个常量值简单赋值。 没有什么有趣的地方...除了这是一个被赋值的原始值,原始值没有“身份”; 也就是说所有的int20的“副本”都是相同的。

第二种和第三种情况有点更有趣。第二种形式使用“装箱”,实际上相当于这个:

Integer i = Integer.valueOf(20);
valueOf 方法可能会创建一个新对象,也可能返回对先前已存在的对象的引用。(事实上,JLS保证valueOf将缓存在范围为 -128..+127 的数字的Integer值。) 相比之下,new Integer(20) 总是创建一个新对象。
这个新对象(或不是)的问题很重要,特别是如果你习惯于使用==来比较Integer包装对象(或类似对象)。在一种情况下,如果你比较“20”的两个实例,==可能是true。在另一种情况下,则保证为false
教训是:使用.equals(...)来比较包装类型而不是==
关于使用哪种形式的问题:
- 如果iint,则使用第一种形式。 - 如果iInteger,则最好使用第二种形式...除非你需要一个与其他实例不同的对象。装箱(或显式调用valueOf)减少了小数值对象分配的数量,是一种值得优化的方式。

说得好。谢谢回复。 - Java Beginner
整数I在创建方面是否等同于int i?Integer I是否不是在堆内存中创建的?因为我得到了Short s=20,当我比较Integer I==Short s时,它会给出编译时错误,但当它是int i==Short s时,它是正确的!!!@Stephen C - Gpar
@Gpar - 1) 不清楚你在问什么。2) 不清楚你在问什么。3) 那不是一个问题。 - Stephen C
@Gpar - 提示:如果你想得到正确的答案,那么请遵循以下步骤:1)搜索StackOverflow以查看是否已经有人提出并回答了类似的问题,然后2)花时间撰写一个合适的问题。 - Stephen C

3

当未分配时,基本类型将采用默认值。

但是包装类是引用类型,因此如果没有分配,它们将为null。这可能会导致在使用时抛出NullPointerException


1
我能想到的一个场景是在映射Hibernate中的数据库类型时。如果您使用Integer,您可以检查null(假设列允许null值)。如果您使用原始类型并且数据库中的值为null,则会抛出错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接