3

假设我们有:

public method(Integer s) {
   ....
}

Java 承认该方法的调用是:

method(7);

或者

int i = 7;
method(i);

这样做时JVM会创建一个新的整数吗?如果我使用相同的 int 多次调用该方法,我是在创建几个 Integer,还是使用了包装器对象的“缓存”版本?

谢谢你。

4

1 回答 1

5

这样做时JVM会创建一个新的整数吗?

不是你给出的例子,不 - 因为它在 [-128, 127] 范围内。如果您的示例是 157,则答案将是特定于实现的。

JLS 的第 5.1.7 节

如果被装箱的值 p 是真、假、一个字节或 \u0000 到 \u007f 范围内的一个字符,或者一个介于 -128 和 127(包括)之间的 int 或短数字,则令 r 1和 r 2为p 的任意两次装箱转换的结果。r 1 == r 2总是如此。

理想情况下,装箱给定的原始值p总是会产生相同的参考。在实践中,使用现有的实现技术这可能是不可行的。上述规则是一种务实的妥协。上面的最后一个条款要求某些常见的值总是被装箱到无法区分的对象中。实现可能会懒惰地或急切地缓存这些。对于其他值,此公式不允许程序员对装箱值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。

这确保了在最常见的情况下,行为将是期望的行为,而不会造成过度的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有 char 和 short 值,以及 -32K 到 +32K 范围内的 int 和 long 值。

于 2013-08-03T20:13:35.893 回答