【问题标题】:What is the correct way to override HashCode() using only one variable?仅使用一个变量覆盖 HashCode() 的正确方法是什么?
【发布时间】:2022-01-14 16:32:20
【问题描述】:

我目前正在尝试学习如何正确覆盖 equals() 和 HashCode() 方法。 我知道如果我想覆盖 equals(),最好覆盖 HashCode(),这就是我目前正在做的事情。我目前使用的类是我自己的名为 Product 的类,带有一个名为 id 的 int 对象变量,如果它们的 id 相同,则此类的两个对象是相等的。 这就是我的 equals 目前的样子:

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Product that = (Product) o;

        return id == that.id;
    }

现在我有一个 equals 方法,它只比较类中的一个变量,我应该如何覆盖 HashCode() 方法? IntelliJ 建议这样做,这似乎有点过于简单:

@Override
public int hashCode() {
    return id;
}

它还为我提供了使用 Java 7+ 功能的选项,这将为我提供:

@Override
public int hashCode() {
    return Objects.hash(id);
}

这两种方法中的任何一种是覆盖 HashCode 的可行方法吗?如果两者都是,在什么情况下使用哪个更好?

【问题讨论】:

标签: java oop hash equals hashcode


【解决方案1】:

如果id 的类型为int(而不是Integer),则id 不能是null,因此您可以使用:

@Override
public int hashCode() {
    return id;
}

但是,如果您想避免new Product(n)Integer.valueOf(n) 共享相同的hashCode,您可以这样做:

@Override
public int hashCode() {
    int hash = getClass().hashCode();
    hash = 31 * hash + id;
    return hash;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2015-05-06
    • 2018-06-09
    相关资源
    最近更新 更多