java的identityhashcode()变量改了

f87*_*576 0 java

为什么 System.identityHashCode() 对同一变量返回不同的 int ?

  public class java {
      public static void main(String[] args) { 
   1-         int v=60000;
   2-         System.out.println(System.identityHashCode(v));
   3-         System.out.println(System.identityHashCode(v));
    
      }
    }
output : 1831932724
         1747585824
Run Code Online (Sandbox Code Playgroud)

Tur*_*g85 6

当我们查看 的签名时System::identityHashCode,我们发现它需要一个Objectas 参数。然而,所提供的代码将原语 ( int) 作为参数传递。被int自动装箱到相应的包装类中(在给定的情况下:)Integer。JavaInteger默认会在一定范围内缓存s,但60_000超出了默认范围。这意味着代码可以重写为:

class Ideone {
  public static void main(String[] args) {
    int v = 60_000;
    final Integer tmp1 = v;
    final Integer tmp2 = v;
    System.out.println(System.identityHashCode(tmp1));
    System.out.println(System.identityHashCode(tmp2));
    System.out.println(tmp1 == tmp2);
  }
}
Run Code Online (Sandbox Code Playgroud)

Ideone demo

请注意,对于我们的讨论,此代码与提供的代码相同,但现在我们看到该代码实际上使用了Integer. 该行为是预期的,因为System:identityHashCode使用Object:hashCode,并且Object:hashCode将(几乎总是)为每个实例返回一个唯一的 id。

如果我们将代码更改为仅使用一个Integer实例,则代码将按预期工作:

class Ideone {
  public static void main(String[] args) {
    final Integer tmp1 = 60_000;
    System.out.println(System.identityHashCode(tmp1));
    System.out.println(System.identityHashCode(tmp1));
    System.out.println(tmp1 == tmp1);
  }
}
Run Code Online (Sandbox Code Playgroud)

Ideone demo