看看下面的代码:
Long minima = -9223372036854775808L;
Long anotherminima = -9223372036854775808L;
System.out.println(minima==anotherminima); //evaluates to false
System.out.println(Long.MIN_VALUE);
Long another= 1L;
Long one = 1L;
System.out.println(another == one); //evaluates to true
我无法理解这种行为..?我希望第一个评估也是正确的..
这就是我所期待的..
JVM 使用一种缓存技术来处理某些范围的自动装箱值。正如规范中所指定的(http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 )
如果装箱的值 p 是 true、false、一个字节或一个在 \u0000 到 \u007f 范围内的字符,或者是 -128 到 127(含)之间的 int 或短数字,则令 r1 和 r2 为以下结果p 的任意两个拳击转换。 r1 == r2 的情况总是如此。
理想情况下,装箱给定的原始值 p 总是会产生相同的引用。实际上,使用现有的实现技术这可能不可行。上述规则是务实的妥协。上面的最后一个子句要求始终将某些公共值装箱到无法区分的对象中。实现可以延迟或急切地缓存它们。对于其他值,此公式不允许程序员对装箱值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。
这确保了在大多数常见情况下,该行为将是所需的行为,而不会造成过度的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有 char 和 Short 值,以及 -32K 到 +32K 范围内的 int 和 long 值。
因此,1L 在此缓存值中,然后自动装箱给出完全相同的引用,但在数字超出此范围的情况下(如 Long.MIN_VALUE),它不会被缓存,因此会给出不同的实例/引用。
无论如何,在比较对象时,您应该始终使用 .equals()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)