为什么 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)
当我们查看 的签名时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)
请注意,对于我们的讨论,此代码与提供的代码相同,但现在我们看到该代码实际上使用了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)
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |