问题描述
这里它们是同一个实例:
Here they are the same instance:
Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2); // outputs "true"
但这里它们是不同的实例:
But here they are different instances:
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2); // outputs "false"
为什么包装对象只在值 127 内共享同一个实例?
Why do the wrapper objects share the same instance only within the value 127?
推荐答案
因为它是由Java语言规范指定的.
Because it's specified by Java Language Specification.
JLS 5.1.7拳击转换:
如果被装箱的值 p
是 true
、false
、byte
或 u0000
到 u007f
范围内的字符,或介于 - 之间的 int
或 short
数字128和127(含),则令r1
和r2
为任意两次装箱转换的结果p
.r1 == r2
总是如此.
If the value
p
being boxed istrue
,false
, abyte
, or achar
in the rangeu0000
tou007f
, or anint
orshort
number between -128 and 127 (inclusive), then letr1
andr2
be the results of any two boxing conversions ofp
. It is always the case thatr1 == r2
.
理想情况下,对给定的原始值 p
进行装箱,总是会产生相同的引用.在实践中,使用现有的实现技术这可能是不可行的.上述规则是一种务实的妥协.上面的最后一个条款要求某些常见的值总是被装箱到无法区分的对象中.实现可能会懒惰地或急切地缓存这些.对于其他值,此公式不允许程序员对装箱值的身份进行任何假设.这将允许(但不要求)共享部分或全部这些引用.
Ideally, boxing a given primitive value p
, would always yield an identical reference. In practice, this may not be feasible using existing implementation techniques. The rules above are a pragmatic compromise. The final clause above requires that certain common values always be boxed into indistinguishable objects. The implementation may cache these, lazily or eagerly. For other values, this formulation disallows any assumptions about the identity of the boxed values on the programmer's part. This would allow (but not require) sharing of some or all of these references.
这可确保在大多数常见情况下,行为将是所需的行为,而不会造成过度的性能损失,尤其是在小型设备上.例如,内存限制较少的实现可能缓存所有 char
和 short
值,以及 int
和 long
值在 -32K 到 +32K 的范围内.
This ensures that in most common cases, the behavior will be the desired one, without imposing an undue performance penalty, especially on small devices. Less memory-limited implementations might, for example, cache all char
and short
values, as well as int
and long
values in the range of -32K to +32K.
这篇关于整数包装对象仅在值 127 内共享相同的实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!