gpt4 book ai didi

java - String 与其他类对象的 hashCode

转载 作者:行者123 更新时间:2023-12-02 11:56:46 27 4
gpt4 key购买 nike

class Employee {
String name;

Employee(String name) {
this.name = name;
}
// hashCode method is not overridden
}

public class HashCodeConfusion {
public static void main(String[] args) {
Employee emp = new Employee("ABC");
Employee emp1 = new Employee("ABC");

if (emp == emp1) {
System.out.println("Employee Same reference");
} else {
System.out.println("Employee Different reference");
}
if (emp.hashCode() == emp1.hashCode()) {
System.out.println("Employee Same hash code");
} else {
System.out.println("Employee Different hash code");
}

// -----------------------------------

String str = new String("ABC");
String str1 = new String("ABC");

if (str == str1) {
System.out.println("String Same reference");
} else {
System.out.println("String Different reference");
}
if (str.hashCode() == str1.hashCode()) {
System.out.println("String Same hash code");
} else {
System.out.println("String Different hash code");
}
}
}

问题/困惑:对象类的默认 hashCode 似乎考虑了对象引用而不仅仅是内容,否则为什么同名的员工类对象会出现不同的哈希码?如果 Object 类的默认实现有一些仅基于内容的哈希算法,只要我的 equals 范式符合按位兼容性,就不需要重写 hashCode 方法。

有什么可以消除这种困惑吗?

最佳答案

默认的 hashCode() 不基于引用,也不基于系统中的任何地址。它是存储在 header 中的随机生成的数字。这样做是为了可以在不更改 hashCode() 的情况下移动对象,并且 hashCode 是相当随机的。

注意:

  • 在一次minor GC之后,eden空间为空,并且创建的第一个对象始终位于相同的地址。它没有相同的 hashCode。
  • 对象默认在 8 字节边界上创建,因此低三位可以全为 000,这对于 hashCode 没有用处。如果您使用压缩 Oops,较低的位可能不会被存储,但仍然不是很随机。
  • 使用Unsafe,您可以读取甚至覆盖存储的 hashCode。在 OracleJVM/OpenJDK 上,hashCode 存储在从对象开头算起的 1 个字节处。
  • 用于存储 hashCode 的位也用于基础锁定。一旦获得对象的内置 hashCode,它就不会使用偏向锁定。
  • 您可以使用 System.identityHashCode(x) 获取任何对象的系统 hashCode,这也是 IdentityMap 使用的方法。

关于java - String 与其他类对象的 hashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47556541/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com