首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用java 9创建包装类的对象

用java 9创建包装类的对象
EN

Stack Overflow用户
提问于 2017-11-22 12:33:45
回答 2查看 1.9K关注 0票数 4

Java 9的一个新特性是取消包装器对象的构造函数。创建新包装器对象的唯一方法是使用它们的valueOf()静态方法。例如,对于Integer对象,Integer.valueOf为-128到127之间的值实现了一个缓存,并在每次调用它时返回相同的引用。

正如Integer类的API所指出的,“静态工厂valueOf(int)通常是一个更好的选择,因为它可能产生更好的空间和时间性能。”JLS说:“给定对应的原语类型的值,通常不需要构造这些box类的新实例。建议的构造替代方法是自动装箱或valueOf静态工厂方法。在大多数情况下,自动装箱将有效,因此可以在需要box类的位置使用其类型为原语的表达式。”

但是,这个范围之外的值会发生什么呢?例如,每次执行类时,Integer = Integer.valueOf(456)是一个新对象吗?

EN

回答 2

Stack Overflow用户

发布于 2017-11-22 12:36:12

两者都有

代码语言:javascript
复制
Integer x = Integer.valueOf(456);

代码语言:javascript
复制
Integer x = 456;

将始终导致创建Integer的新实例,因为456超出了Integer缓存的范围。

您可以通过编写

代码语言:javascript
复制
Integer x1 = Integer.valueOf(456);
Integer x2 = Integer.valueOf(456);
System.out.println(x1==x2);

它将打印false

票数 6
EN

Stack Overflow用户

发布于 2017-11-22 13:33:25

首先,为什么要费心处理这些细节--比较Integer对象的正确方法是使用以下两种方法:

if (x.intValue() == y.intValue())或更好的x.equals(y)

不要依赖于在任何情况下都存在缓存这一事实,因为可以将此缓存的上限更改为属性,您可以通过以下方法查看它:

代码语言:javascript
复制
java -XX:+PrintFlagsFinal | grep AutoBoxCacheMax
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47434850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档