How/why Java 中的整数缓存速度更快吗?

How/why is Integer caching faster in Java?

根据 Java 语言规范,section 5.1.7、Java 缓存 Integer 从 -128 到 127 以进行性能优化。

因此,当您将 a == b 与缓存范围内的 ab 整数进行比较时,它 returns 为真,即使它们是不同的对象。

从机制上讲,此缓存会带来哪些性能优势?根据 this 的回答,"The purpose is mainly to save memory, which also leads to faster code due to better cache efficiency." 它如何导致更快的代码?我如何使用此功能来提高我编写的实际代码的性能?

是否与IntegerCache class中的以下方法有关?

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

性能优势与 == 无关。真正的原因是当相同的 "small" 整数被重复装箱时,缓存允许 valueOf 避免创建大量对象。 Integer 个对象占用 space(至少 16 个字节)。创建大量垃圾意味着垃圾收集器需要更频繁地运行。

我的理解是 Java 团队对实际应用程序进行了大量分析,得出的结论是 Integer 缓存是值得优化的。

(我之所以说它与 == 无关,是因为你不能 依赖 ==Integer 工作对象。因此,执行此操作的任何代码......同时还不能确保整数在指定范围内......是错误的。如果你进行范围检查以确保数字在范围内,你可能会花在上面的钱比你用 == 节省的钱还多。)


"... which also leads to faster code due to better cache efficiency." How does it lead to faster code?

他们所说的缓存效率是大多数现代处理器用来处理CPU和内存速度不匹配的硬件级内存缓存。如果应用程序只有一个 Integer 对象代表数字 1 并且该数字经常出现,那么保存 1 对象的内存地址在(内存)缓存中的机会就会增加.缓存命中意味着更快的代码。


Does it have anything to do with the following method found in the IntegerCache class?

呃……是的。