为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的整数缓存

/ 猿问

Java中的整数缓存

慕桂英546537 2019-07-15 16:09:08

Java中的整数缓存

最近,我看到了一个演示文稿,其中有以下Java代码示例:

Integer a = 1000, b = 1000;  System.out.println(a == b); // false  Integer c = 100, d = 100;  System.out.println(c == d); // true

现在我有点糊涂了。我理解为什么在第一种情况下,结果是“false”-这是因为Integer是一种引用类型,而“a”和“b”的引用是不同的。

但为什么在第二种情况下,结果是“真实的”呢?

我听说过一种观点,JVM为int值缓存对象从-128到127,以便进行一些优化。这样,“c”和“d”的引用是相同的。

有人能给我更多关于这种行为的信息吗?我想了解这个优化的目的。在什么样的情况下性能得到提高等。对这一问题的一些研究将有很大的参考价值。


查看完整描述

3 回答

?
白板的微信

我想了解这个优化的目的。在什么样的情况下性能得到提高等。对这一问题的一些研究将有很大的参考价值。

其目的主要是为了节省内存,这也导致更快的代码,因为更好的缓存效率。

基本上,Integer类的缓存Integer实例的范围为-128到127,以及所有自动装箱、文字和使用Integer.valueOf()将从该缓存返回它所涵盖的范围的实例。

这是基于这样的假设,即这些小值比其他int发生的频率高得多,因此避免为每个实例设置不同对象的开销是有意义的(Integer对象占用大约12个字节)。


查看完整回答
反对 回复 2019-07-15
?
PIPIONE

的实现Integer.valueOf(int)..它将返回相同的Integer对象的输入小于256.

编辑:

实际上-128+127默认情况下,如下所示。


查看完整回答
反对 回复 2019-07-15
?
哈士奇WWW

你似乎对什么是“实例”有严重的误解。根本不可能有两个不同的值“属于同一个Integer实例”。对象实例基本上是一个内存区域。您可以有多个具有相同值的不同实例,但不能相反。缓存将为不同的值返回不同的实例;它只是确保始终获得相同值的相同实例。

查看完整回答
反对 回复 2019-07-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信