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

use*_*958 13 java equals

可能重复:
在Java中覆盖equals和hashCode

如果我有

class A {
    int x = 1;
}
...
A a1 = new A();
A a2 = new A();
a1.equals(a2);
Run Code Online (Sandbox Code Playgroud)

如果我比较两个A的实例而没有覆盖equals方法,我会得到预期的结果吗?

Jon*_*eet 31

如果我比较两个A的实例而没有覆盖equals方法,我会得到预期的结果吗?

这取决于你的期望:)

默认实现将为您提供引用相等性 - 换句话说,当您比较两个引用时,equals只有在引用同一对象时才返回true.

您通常会覆盖equals实现"值相等" - 其中两个不同的对象被认为是相等的,通常是由于它们本身具有相等的字段值.平等的确切含义取决于您的设计 - 例如,两个对象在其他方面仍然可以区分.

如果你覆盖equals,你应该覆盖hashCode以保持一致equals,这样如果a.equals(b)为真,那么a.hashCode() == b.hashCode().这将允许您的类的实例用作基于散列的集合中的键(例如HashMap),以便您可以基于等于原始键的键查找值,而不必使用对精确的引用原始关键对象.

  • 这是否意味着,如果我不重写equals方法,那么equals()的行为与==相同? (8认同)
  • @ user926958:是的,完全正确. (8认同)