【问题标题】:hashCode() method [duplicate]hashCode() 方法 [重复]
【发布时间】:2021-05-20 02:22:46
【问题描述】:

我需要一些帮助以从理论上更好地理解 hashCode() 方法。我读过(强调我的):

hashCode() 在两个单独的对象上调用时(根据equals() 方法它们相等),它返回相同的哈希码值。 但是,如果在两个不相等的对象上调用它,它不一定会返回不同的整数值

所说的异常在哪里发生?

【问题讨论】:

标签: java hash hashcode


【解决方案1】:

假设您有一个包含两个字符串字段的类,并且它的哈希码是通过将这两个字段的哈希码相加来计算的。进一步假设您有一个 equals 来简单地检查类字段值是否相等。

class Test {
    String a;
    String b;

    public Test
    
    @Override
    public int hashCode() {
        return a.hashCode() + b.hashCode();
    }


    @Override
    public boolean equals(Object o) { // simplified
         Test other = (Test)o;
         return a.equals(other.a) && b.equals(other.b);
    }
}

让我们看看不相等的实例是否可以具有相同的哈希码

Test t1 = new Test("hello", "world");
Test t2 = new Test("world", "hello");

System.out.println(t1.equals(t2));                  // false
System.out.println(t1.hashCode() == t2.hashCode()); // true

我们还在尊重hashCode's contract吗?

只要在 Java 应用程序执行期间对同一个对象多次调用它,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。该整数不需要在应用程序的一次执行与同一应用程序的另一次执行之间保持一致。

嗯,是的,因为它只依赖于ab,我们使用他们的hashCode 方法,我们可以假设它尊重合同。

如果两个对象根据equals(Object) 方法相等,那么对这两个对象中的每一个调用hashCode 方法必须产生相同的整数结果。

确实

Test t1 = new Test("hello", "world");
Test t2 = new Test("hello", "world");

System.out.println(t1.equals(t2));                  // true
System.out.println(t1.hashCode() == t2.hashCode()); // true

如果根据equals(java.lang.Object) 方法,如果两个对象不相等,则不要求对这两个对象中的每一个调用hashCode 方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

这就是我们最初试图展示的内容。这不是必需的。

【讨论】:

    【解决方案2】:
    public int hashCode() {
      return 27;
    }
    

    信不信由你,尽管这不是一种非常有效的工作方式,但它是 hashCode 的有效实现,因为它会遵守 equals 方法的约定。此实现将导致您所描述的内容。

    hashCode 用于限制要比较的案例数量。 例如,如果在高中,您正在寻找学生。您只知道该学生的姓名、性别和年龄。您是要查看所有学生,还是只查看具有该年龄和性别的学生?

    对于某些数据结构,hashCode 也是如此。在查找项目时,它会首先创建具有相同 hashCode 的项目的子列表/集合,然后在该子列表/集合中搜索确切的项目。

    哈希码越具体,搜索效率越高。

    【讨论】:

      猜你喜欢
      • 2014-10-17
      • 2016-06-06
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2013-07-28
      • 2018-03-27
      • 2012-10-19
      • 2016-03-05
      相关资源
      最近更新 更多