Java 中的整数缓存

2022-08-31 15:55:32

可能的副本:
奇怪的Java拳击

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

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

现在我有点困惑。我理解为什么在第一种情况下结果是“假的” - 这是因为整数是一种引用类型,“a”和“b”的引用是不同的。

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

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

任何人都可以给我更多关于这种行为的信息吗?我想了解此优化的目的。在什么情况下性能得到提高,等等。参考这个问题的一些研究会很棒。


答案 1

我想了解此优化的目的。在什么情况下性能得到提高,等等。参考这个问题的一些研究会很棒。

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

基本上,该类在 -128 到 127 的范围内保留实例的缓存,并且所有自动装箱、文本和用法都将从该缓存中返回其所覆盖范围的实例。IntegerIntegerInteger.valueOf()

这是基于这样的假设,即这些小值比其他整数更频繁地出现,因此避免为每个实例使用不同对象的开销是有意义的(一个对象占用大约12个字节)。Integer


答案 2

查看 的实现。对于小于 的输入,它将返回相同的对象。Integer.valueOf(int)Integer256

编辑:

它实际上是默认的,如下所述。-128+127


推荐