java - 两个 hashCode 是否相等是否重要,即使这两个对象不是来自同一类型?

标签 java unique equals hashcode

假设我有两种类型 AB,它们都有一个唯一的 id 字段,下面是我通常如何实现 equals( ) 和 hashCode() 方法:

@Override
public boolean equals(Object obj) {
    return obj instanceof ThisType && obj.hashCode() == hashCode();
}

@Override
public int hashCode() {
    return Arrays.hashCode(new Object[] { id });
}

在那种情况下,假设 AB 都有一个 1-arg 构造函数来设置它们各自的 id 字段,

new A(1).equals(new A(1)) // prints true as expected,
new A(1).equals(new A(2)) // prints false as expected,
new A(1).equals(new B(1)) // prints false as expected.

还有,

new A(1).hashCode() == new B(1).hashCode() // prints true.

我想知道两个 hashCode 是否相等是否重要,即使这两个对象不是来自同一类型? hashCode() 可以用在 equals() 之外的其他地方吗?如果是,目的是什么?


我考虑过如下实现这两种方法:

@Override
public boolean equals(Object obj) {
    return obj != null && obj.hashCode() == hashCode();
}

@Override
public int hashCode() {
    return Arrays.hashCode(new Object[] { getClass(), id });
}

将类添加到 hashCode 生成将解决这个潜在问题。你怎么认为?有必要吗?

最佳答案

对于不同类的对象,相同的hashCode()没有关系。 hashCode() 只是表示对象可能相同。如果例如HashSet 遇到相同的 hashCode() 时,它将使用 equals() 测试是否相等。

关于java - 两个 hashCode 是否相等是否重要,即使这两个对象不是来自同一类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14749229/

相关文章:

java - 如何在 Java 中使用 Math.random() 生成等概率随机数

java - 接口(interface)的内联实现

java - hibernate ,按 id 或唯一列选择

java - 确定两个参与者的 equals() 方法不起作用

mysql - 在 Ruby 中使用哈希向 MySQL 文本字段字符串添加唯一索引

algorithm - 从具有容错性的多个值生成唯一 ID

java - Kotlin 中的 Lambda 混淆,it == x 与 equals(x)

java - 为什么我应该使用 onPrepareDialog 等在 Android 中显示 ProgressDialog?

java - Spring Batch Admin,无法替换占位符 'batch.business.schema.script'

java - 通过java代码构建动态查询