在java中何时重写equals和hashcode

在java中何时重写equals和hashcode,java,Java,我知道有很多关于“如何覆盖equals和hashcode”和“如果我们覆盖一个而不是另一个的问题”的博客 我的问题很简单。在什么情况下建议重写equals和hashcode 我很确定大多数教程都解释了如何做。。。也可以对你说“为什么”,你可能需要重写那些方法 无论如何,这样做的主要原因是:如果您的类包含各种字段,并且您希望确保类的两个对象具有“相同”的内容。。。结果是平等的 因此,您最关心equals/hashCode的地方是在开始将对象推入集合时 比如: 然后: 你希望从中得到什么 只要需要覆

我知道有很多关于“如何覆盖equals和hashcode”和“如果我们覆盖一个而不是另一个的问题”的博客


我的问题很简单。在什么情况下建议重写equals和hashcode

我很确定大多数教程都解释了如何做。。。也可以对你说“为什么”,你可能需要重写那些方法

无论如何,这样做的主要原因是:如果您的类包含各种字段,并且您希望确保类的两个对象具有“相同”的内容。。。结果是平等的

因此,您最关心equals/hashCode的地方是在开始将对象推入集合时

比如:

然后:


你希望从中得到什么

只要需要覆盖默认的相等概念,就可以这样做:两个对象只有在它们是同一个对象时才相等

换句话说,在某种意义上,当两个不同的实例可以“相等”时

例如,
整数
覆盖
等于
,因为
新整数(2)!=新的整数(2)
,但您希望
新的整数(2)。等于(新的整数(2))
。直观地说,一个表示
2
的对象应该等于另一个表示
2
的对象


您需要同时重写
hashCode
,以便您的值与基于哈希的数据结构中的
equal
实现保持一致。

简单回答:当您需要它们与默认实现不同时。附加答案:在大多数情况下,如果该类的实例应放入一个集合或用作映射键,则需要这样做。但是,还有其他情况,例如,如果您希望两个不同的实例具有相同的字段值,则它们被视为相等(在这种情况下,您将重写
equals()
,当然还有
hashCode()。
public class Example {
  private final String someId;
  Example(String incoming) { someId = incoming };
new Example(new String("1")).equals(new Example(new String("1))