当原始类型传递给期望原始类型的Wrapper的方法时,java是否会创建一个新的Object?

时间:2013-08-03 20:12:27

标签: java object memory-management wrapper primitive-types

说我们有:

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

Java承认调用该方法:

method(7);

int i = 7;
method(i);

JVM在执行此操作时是否会创建新的Integer?如果我使用相同的int多次调用该方法,我是否创建了几个整数,或者使用了包装对象的“缓存”版本?

谢谢。

1 个答案:

答案 0 :(得分:5)

  

JVM在执行此操作时是否会创建新的Integer?

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

来自section 5.1.7 of the JLS

  

如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的int或短数字,则让r 1 和r 2 是p的任意两次装箱转换的结果。情况总是r 1 == r 2

     

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

     

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