栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

创建一个持有值1的新Integer对象?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

创建一个持有值1的新Integer对象?

您跳过了预期的解决方案:

Integer p = Integer.valueOf(1);

此模式称为Factory方法模式。有人可能会问这种方法有什么好处。幸运的是,class

Integer
的实现是开源的,因此让我们看一下:

    public static Integer valueOf(int i) {        if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)];        return new Integer(i);    }

似乎存在某种

Integer
-value缓存。如果请求一个
Integer
具有缓存范围内的值的Java,则Java不会创建新对象,而是返回先前创建的对象。这
Integer
是可行的,因为s是不可变的。甚至可以使用system属性来控制高速缓存上限
java.lang.Integer.IntegerCache.high=...

为什么其他两种创建

Integer
警告的方法也会产生警告?因为它们已被Java 9弃用。

Integer#Integer(intvalue)

不推荐使用
。很少适合使用此构造函数。

valueOf(int)
通常,静态工厂是一个更好的选择,因为它可能会产生明显更好的空间和时间性能。[…]

Integer#Integer(Strings)

不推荐使用
。很少适合使用此构造函数。使用

parseInt(String)
一个字符串转换为
int
原始的,或使用
valueOf(String)
一个字符串转换为一个
Integer
对象。[…]

仅出于完整性考虑,以下是用于

Integer.valueOf(inti)

返回

Integer
表示指定
int
值的实例。如果
Integer
不需要新实例,则通常应优先于构造方法使用
Integer(int)
此方法,因为通过缓存经常请求的值,此方法可能会产生明显更好的空间和时间性能。此方法将总是在范围内的缓存值
-128
127
,包容性,并可以外接高速缓存的这个范围以外的值。


编辑1:感谢@VGR提到

Integer p = 1;

等同于

Integer p = Integer.valueOf(1);

但是,这仅适用于和

int
之间的
-128
-值
127
。该行为在JLS§5.1.7中定义:

[…]如果该值

p
被装箱是评价类型的常量表达式(§15.28)的结果
boolean
char
short
int
,或
long
,其结果是
true
false
在的范围内的字符
'u0000'
,以
'u007f'
包容,或在范围内的整数
-128
127
包容性的,然后让
a
b
是任意两个装箱转换的结果
p
。总是这样的
a== b


虽然不在JLS中,但

javac
我正在使用(
9.0.4
)的版本确实将装箱压缩到了AdamRosenfield
Integer.valueOf(...);
在此答案中所示的位置。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号