java - Java中的整数缓存

标签 java optimization jvm

Possible Duplicate:
Weird Java Boxing

最近我看到一个演示文稿,其中有以下 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”的引用是一样的。

谁能给我更多关于这种行为的信息?我想了解这种优化的目的。在什么情况下性能会提高等等。引用这个问题的一些研究会很好。

最佳答案

I want to understand purposes of this optimization. In what cases performance is increased, etc. Reference to some research of this problem will be great.

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

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

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

关于java - Java中的整数缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3131136/

相关文章:

java - 响应不包含零整数

java - 如何在java中定义相对路径

python - Lambdify 与 Python 一起工作,但在 Cython 上抛出异常

assembly - 汇编中的冗余值复制?

Java EE - 具有许多 Web 应用程序的应用程序服务器的 JVM

java - 理解 perf.map

java - 如何将数组列表项设置为 JButton

java - 如何避免hibernate默认按id排序?

java - 覆盖 Java System.currentTimeMillis 以测试时间敏感代码

c - 注释是否消耗内存和/或使用周期?