java中奇怪的等式行为

Moh*_*hit 5 java

看看下面的代码:

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
Run Code Online (Sandbox Code Playgroud)

我无法理解这种行为..?我希望第一个eval也是真的..这就是我所期待的......

Jon*_*ier 4

JVM 使用一种缓存技术来处理某些范围的自动装箱值。如规范中所指定(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()