System.idendityHashCode() 和 hashCode() 方法的内部工作原理是什么?
what is the internal working of System.idendityHashCode() and hashCode() method?
我阅读了关于 System.identityHashCode(对象 x)。您不能覆盖它,因为它是静态方法,但我可以覆盖 Object 的 hashCode 方法。并且在 javadoc 中针对 System.identityHashCode(Object x) 也提到了这一点:
Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides
hashCode().The hash code for the null reference is zero.
但是当我在代码下方 运行 通过交换 println 方法中的对象时,我得到了相同的结果。
public class SherlockGCD {
public int hashCode()
{
return super.hashCode();
}
public static void main(String[] args) {
SherlockGCD sher= new SherlockGCD();
SherlockGCD sher1= new SherlockGCD();
System.out.println(System.identityHashCode(sher));
System.out.println(sher1.hashCode());
}
}
输出是:
31866429
16795905
但是如果你如下交换对象,那么输出也是一样的
System.out.println(System.identityHashCode(sher1));
System.out.println(sher.hashCode());
输出是:
31866429
16795905
为什么输出不是反转,因为我正在更改 println 方法中的对象??
不清楚您要做什么。给定的对象引用具有给定的哈希码。对于 identityHashCode
和未覆盖的 hashCode
,这将被 returned。但是,您有两个不同的对象引用。因此,如果 Object.hashCode
未被覆盖,它们将具有不同的哈希码。
你在运行之间看到相同的 hashCodes 是偶然的。如果您这样做的时间足够长,并且经过足够多的 JVM 重新启动,情况就不会如此。
您确实以相同的顺序看到相同的 hashCodes,这是因为 hashCodes 仅在您首次调用 hashCode 时才分配给对象引用,而不是在创建对象时。因此,无论它是哪个对象,第一次调用 hashCode 都会获得两次运行中的第一个代码。
尝试
// both lines output the same hashCode for sher
System.out.println(System.identityHashCode(sher));
System.out.println(sher.hashCode());
和
// both lines output the same hashCode for sher1
System.out.println(System.identityHashCode(sher1));
System.out.println(sher1.hashCode());
如果将所有 4 行并排放置,您将看到两行相同的行,然后是另外两行与第一行不同的相同行。
如果您现在想 return 为 hashCode()
和 identityHashCode
使用不同的 hashCode,则在覆盖中添加一个字段和 return hashCode:
public class SherlockGCD {
private int id;
public SherlockGD(int id) { this.id = id; }
public int hashCode()
{
return id;
}
...
but when i am running below code by swapping the object in println method i am getting same result.
您不应将 hashCode
的结果与一个 运行 的结果与另一个 运行 的结果进行比较。例如,您 可能 观察到身份哈希码是延迟分配的 - 因此无论您请求哈希码的哪个对象首先获得 31866429,下一个获得 16795905 - 在您的特定系统上。
如果您在单个 运行 中颠倒顺序 ,您应该会看到一致的结果:
System.out.println(System.identityHashCode(sher));
System.out.println(sher1.hashCode());
System.out.println(System.identityHashCode(sher1));
System.out.println(sher.hashCode());
此处输出的第 1 行和第 4 行应具有相同的值,第 2 行和第 3 行应具有相同的值。
我阅读了关于 System.identityHashCode(对象 x)。您不能覆盖它,因为它是静态方法,但我可以覆盖 Object 的 hashCode 方法。并且在 javadoc 中针对 System.identityHashCode(Object x) 也提到了这一点:
Returns the same hash code for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode().The hash code for the null reference is zero.
但是当我在代码下方 运行 通过交换 println 方法中的对象时,我得到了相同的结果。
public class SherlockGCD {
public int hashCode()
{
return super.hashCode();
}
public static void main(String[] args) {
SherlockGCD sher= new SherlockGCD();
SherlockGCD sher1= new SherlockGCD();
System.out.println(System.identityHashCode(sher));
System.out.println(sher1.hashCode());
}
}
输出是:
31866429
16795905
但是如果你如下交换对象,那么输出也是一样的
System.out.println(System.identityHashCode(sher1));
System.out.println(sher.hashCode());
输出是:
31866429
16795905
为什么输出不是反转,因为我正在更改 println 方法中的对象??
不清楚您要做什么。给定的对象引用具有给定的哈希码。对于 identityHashCode
和未覆盖的 hashCode
,这将被 returned。但是,您有两个不同的对象引用。因此,如果 Object.hashCode
未被覆盖,它们将具有不同的哈希码。
你在运行之间看到相同的 hashCodes 是偶然的。如果您这样做的时间足够长,并且经过足够多的 JVM 重新启动,情况就不会如此。
您确实以相同的顺序看到相同的 hashCodes,这是因为 hashCodes 仅在您首次调用 hashCode 时才分配给对象引用,而不是在创建对象时。因此,无论它是哪个对象,第一次调用 hashCode 都会获得两次运行中的第一个代码。
尝试
// both lines output the same hashCode for sher
System.out.println(System.identityHashCode(sher));
System.out.println(sher.hashCode());
和
// both lines output the same hashCode for sher1
System.out.println(System.identityHashCode(sher1));
System.out.println(sher1.hashCode());
如果将所有 4 行并排放置,您将看到两行相同的行,然后是另外两行与第一行不同的相同行。
如果您现在想 return 为 hashCode()
和 identityHashCode
使用不同的 hashCode,则在覆盖中添加一个字段和 return hashCode:
public class SherlockGCD {
private int id;
public SherlockGD(int id) { this.id = id; }
public int hashCode()
{
return id;
}
...
but when i am running below code by swapping the object in println method i am getting same result.
您不应将 hashCode
的结果与一个 运行 的结果与另一个 运行 的结果进行比较。例如,您 可能 观察到身份哈希码是延迟分配的 - 因此无论您请求哈希码的哪个对象首先获得 31866429,下一个获得 16795905 - 在您的特定系统上。
如果您在单个 运行 中颠倒顺序 ,您应该会看到一致的结果:
System.out.println(System.identityHashCode(sher));
System.out.println(sher1.hashCode());
System.out.println(System.identityHashCode(sher1));
System.out.println(sher.hashCode());
此处输出的第 1 行和第 4 行应具有相同的值,第 2 行和第 3 行应具有相同的值。