java - 如何重写这个 hashCode 方法?

标签 java

关于Person的定义:

public class Person {
    private int id;
    private int characteristics;
    public boolean equals (Object obj) {
           if (obj == this) {
                 return true;
           }
           if (obj instanceof Person) {
                 if (id == ((Person) obj).id) {
                     return true;
                 } else if (characteristics == ((Person) obj).characteristics) {
                     return true;
                 }
           }
           return false;
    }
}

原因 2 Person 对象 ab 必须具有相同的哈希码如果 a.equals(b) 返回true,我该如何实现hashCode方法呢?

解决方案

根据 Java 的等价协议(protocol),我的 equals 方法实现不正确:传递性 不满足:a.id = 1, a.characteristic = 2, b.id = 1, b.characteristic = 3, c.id = 2, c.characteristic = 3; a.equals(b) == trueb.equals(c) == true,但是 a.equals(c) == false.

最佳答案

由于当对象各自的 idcharacteristics 字段相等时,您的类认为对象相等,因此您可以在此处合理使用的唯一哈希码是所有对象的常量值实例:

public int hashCode() {
    return 0;
}

这将使基于散列的查找执行得非常糟糕。

equals() 中的非此即彼测试通常不是一个好主意;这些对象实际上并不相等,对吗?或许他们只是“相亲相爱”?或许您应该考虑单独使用 equals() 并实现一些其他比较方法。


正如 Thomasz 所指出的,您的 equals() 测试不是可传递的;如果 a.equals(b) && b.equals(c) 为真,则 a.equals(c) 必须为真。这对于您的重载是正确的,因此您的实现违反了equals() 的约定。我强烈建议您以不同的方法实现此测试,不要管 equals()

关于java - 如何重写这个 hashCode 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987112/

相关文章:

java - javaMail SMTP session 属性 mail.smtp.ssl.protocols 可能有哪些值?

java - 如何将 Optional 转换为 OptionalInt?

java - VS接口(interface)中定义的匿名类。接口(interface)之外的具体类

java - 在 spring-boot-maven-plugin 打包的 jar 中使用 ClassPath.getTopLevelClasses() 查找类

java - 字符串在 Java 哈希表中出现的次数

java - 将 JedisPool 与 Tomcat 一起使用,资源不会返回到池中

java - 如何更改S3Client.getURL的格式

java - 在 ELEMENT_NODE 的情况下,node.getNodeType 无法按预期工作

java - 如何将带有类的 JAR 文件分发给其他开发人员?

java - 如何将 "warning"消息从 Service/DAO 传递到 UI?