这里它们是同一个实例:
Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2); // outputs "true"
但这里它们是不同的实例:
Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2); // outputs "false"
为什么包装器对象仅在值 127 内共享相同的实例?
因为它是由 Java 语言规范指定的。
JLS 5.1.7 拳击转换 http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7:
If the value p
being boxed is true
, false
, a byte
, or a char
in the range \u0000
to \u007f
, or an int
or short
number between -128 and 127 (inclusive), then let r1
and r2
be the results of any two boxing conversions of p
. It is always the case that r1 == r2
.
理想情况下,对给定的原始值进行装箱p
,总是会产生相同的参考。实际上,使用现有的实现技术这可能不可行。上述规则是务实的妥协。上面的最后一个子句要求始终将某些公共值装箱到无法区分的对象中。实现可以延迟或急切地缓存它们。对于其他值,此公式不允许程序员对装箱值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。
这确保了在大多数常见情况下,该行为将是所需的行为,而不会造成过度的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有char
and short
价值观,以及int
and long
值范围为 -32K 至 +32K。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)