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

什么时候需要覆盖equals和hashcode方法?

冀鸿才
2023-03-14
问题内容

如果我有

class A {
    int x = 1;
}
...
A a1 = new A();
A a2 = new A();
a1.equals(a2);

如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果?


问题答案:

如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果?

这取决于您的期望:)

默认实现将为您提供 引用相等性-换句话说,当您比较两个引用时,equals仅当它们是对同一对象的引用时才返回true。

通常,您将重写equals以实现“值相等”,在这种情况下,两个不同的对象通常被认为具有相等的字段值,因此被视为相等。相等的确切含义将取决于您的设计-例如,这两个对象仍然可以通过其他方式区分。

如果覆盖equals,你应该 _也_覆盖hashCode到与其保持一致equals,例如,如果a.equals(b)是真的,那么a.hashCode() ==b.hashCode()。这将允许您将类的实例用作基于哈希的集合(例如HashMap)中的键,以便您可以基于与原始键 _相同_的键来查找值,而不必使用对精确键的引用。原始关键对象。



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

  • 问题内容: 在java中为什么需要覆盖equals和hashcode方法?什么时候用到? 问题答案: 让我们尝试通过一个示例来理解它,如果我们不进行覆盖而覆盖并尝试使用。 假设我们有一个类像这样那样的两个对象是相等的,如果他们等于(和生成) 仅覆盖 如果仅覆盖被覆盖,则在你第一次调用时将散列到某个存储桶,而在调用时将散列到其他存储桶(因为它们具有不同的)。因此,尽管它们是相等的,但由于它们没有散列

  • 问题内容: 我应该为我创建的任何类重写函数吗? 即使是非常简单的类只包含一些非常简单的属性,并通过 平等 ,我需要它的每一个属性是一样的吗? 问题答案: 我应该为我创建的任何类重写equals函数吗? 当(且仅当)对象“表示某些数据”(即,如果它对,或(例如,这些通常以集合等结尾))进行建模时,覆盖。不要覆盖其他类型的类的equals,例如或。 请记住,无论何时重写,都应始终重写。 (一个自然的后

  • 问题内容: 为什么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()