当前位置: 首页 > 面试题库 >

在java中为什么需要覆盖equals和hashcode方法?

柳胡媚
2023-03-14
问题内容

java中为什么需要覆盖equals和hashcode方法?什么时候用到?


问题答案:

让我们尝试通过一个示例来理解它,如果我们equals()不进行覆盖而覆盖hashCode()并尝试使用Map

假设我们有一个类像这样那样的两个对象MyClass是相等的,如果他们importantField等于(与hashCode()equals()Eclipse生成)

public class MyClass {

    private final String importantField;
    private final String anotherField;

    public MyClass(final String equalField, final String anotherField) {
        this.importantField = equalField;
        this.anotherField = anotherField;
    }

    public String getEqualField() {
        return importantField;
    }

    public String getAnotherField() {
        return anotherField;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((importantField == null) ? 0 : importantField.hashCode());
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final MyClass other = (MyClass) obj;
        if (importantField == null) {
            if (other.importantField != null)
                return false;
        } else if (!importantField.equals(other.importantField))
            return false;
        return true;
    }

}

仅覆盖 equals

如果仅equals覆盖被覆盖,则在你myMap.put(first,someValue)第一次调用时将散列到某个存储桶,而在调用myMap.put(second,someOtherValue)时将散列到其他存储桶(因为它们具有不同的hashCode)。因此,尽管它们是相等的,但由于它们没有散列到同一个存储桶中,因此地图无法实现,因此它们都留在了地图中。

尽管equals()如果我们要覆盖,则不必覆盖hashCode(),但让我们看看在这种特殊情况下会发生什么,在这种情况下,我们知道如果两个对象MyClass相等,则它们importantField相等但我们不覆盖equals()

仅覆盖 hashCode

想象你有这个

MyClass first = new MyClass("a","first");
MyClass second = new MyClass("a","second");

如果仅覆盖,hashCode则在调用myMap.put(first,someValue)它时会先进行计算,hashCode然后将其计算并存储在给定存储桶中。然后,在调用时myMap.put(second,someOtherValue),应根据地图文档将其替换为第二,因为它们相等(根据业务要求)。

但问题是,等于没有重新定义,所以当图哈希second通过桶和迭代,查找是否有一个对象k,从而second.equals(k)是事实,就不会找到任何的second.equals(first)false。



 类似资料:
  • 问题内容: 如果我有 如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果? 问题答案: 如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果? 这取决于您的期望:) 默认实现将为您提供 引用相等性-换句话说,当您比较两个引用时,仅当它们是对同一对象的引用时才返回true。 通常,您将重写以实现“值相等”,在这种情况下,两个不同的对象通常被认为具有相等的字段

  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha

  • 问题内容: 为什么StringBuffer的/ StringBuilder的没有覆盖,从对象的方法? 请给我建议清晰的图片,以帮助理解问题… 问题答案: 因为是可变的,所以它的主要用途是 构造 字符串。如果要比较内容,请调用并比较返回的值。 覆盖可变对象通常没有用,因为修改用作a键的对象可能会导致存储的值“丢失”。

  • 在阅读了大量文档和文章后,我真的对和方法感到非常困惑。主要是,有各种各样的例子和用法让我太困惑了。 那么,你能澄清一下以下几点吗? 1? 2.如果有一个唯一的键,例如,那么我们应该只使用这个字段吗?或者我们应该将它与组合,如下所示? 3.naturaid怎么样?据我所知,它用于唯一字段,例如,<代码>私有字符串isbn 。它的用途是什么?它是否与方法有关?

  • 菜单栏: Code —> Generate —> equals() and hashCode() 右键菜单:Generate —> equals() and hashCode() 快捷键: Mac: command + N Windows\/Linux: Alt + Insert —> equals() and hashCode()

  • 问题内容: 如果我重写一个类两种方法,它必须确保,如果那么也必须是真实的。 有人可以告诉我一个简单的示例,如果违反了该示例,将会引起问题吗?我认为这与您使用该类作为Hashmap的键类型有关吗? 问题答案: 当然: 与: 从技术上讲应该是正确的,因为在两种情况下m == 3。 通常,HashMap的工作方式如下:它具有可变数量的通常称为“存储桶”的数量。存储桶的数量可以随时间变化(随着条目的添加和