在Java中重写equals()和hashCode()

在Java中重写equals()和hashCode(),java,Java,可能重复: 全部, 我已经定义了我的类以及重写equals()和hashCode()方法的类。但是我不知道这些方法应该为我自己的类具体实现什么。有谁能解释一下自定义类的这些方法的实现吗?对于equals,答案取决于您的业务需求,即对象的equals意味着什么 hashCode()应始终为对象返回唯一值,除非该对象等于另一个对象。它应该取决于对象上属性的值 基本上,如果要在集合(映射、集合、列表)中存储对象,则必须根据文档中定义的约定实现equals和hashCode方法 否则,许多集合实现将不

可能重复:

全部,


我已经定义了我的类以及重写equals()和hashCode()方法的类。但是我不知道这些方法应该为我自己的类具体实现什么。有谁能解释一下自定义类的这些方法的实现吗?

对于equals,答案取决于您的业务需求,即对象的equals意味着什么


hashCode()应始终为对象返回唯一值,除非该对象等于另一个对象。它应该取决于对象上属性的值

基本上,如果要在集合(映射、集合、列表)中存储对象,则必须根据文档中定义的约定实现equals和hashCode方法


否则,许多集合实现将不会具有预期的行为。有关实现线索,请阅读和的对象Javadoc。

阅读中两个方法的API文档。它非常准确地描述了重写实现的行为。

在实现equals()时,请确保理解equality和identity之间的区别。 两个对象实例可能“相等”,但可能不相同。 a、 equals(b)是一种平等测试,您的业务规则应该定义它。
==是对对象标识的测试(相同的对象实例)

您说您已经知道哪个自定义类需要重写hashCode/equals?然后您还知道哪些属性(全局变量)决定每个类的相等性

当您知道这些属性时,您可以手动实现hashCode/equals,也可以通过使用现代IDE(如Eclipse、NetBeans等)生成方法来实现。在Eclipse中,“源”菜单下有一个名为“Generate hashCode()and equals()”的选项


最重要的是,对于equals()返回的对象,hashCode()不能返回不同的值true@michael很好,编辑答案。它不能总是返回唯一的值。使其依赖于与
equals
相同的属性是最容易的。您只能有2^32个不同的哈希代码,但我可以想到更多不同的字符串。它们不能都有唯一的哈希代码。只有哈希中的键才能正确定义哈希代码。我可以将我的Froboz对象存储在HashMap中,而不重写
equals()
hashCode()
方法,如果我使用
String
作为键,并且使用String,
equals()
hashCode()
实现已经正确定义。True。但会失败。这实际上取决于你如何定义平等。通常需要考虑所有或几乎所有的属性,有时只考虑一个或几个属性,有时(比如线程),在equals()方法中,您只需要比较标识。这个答案是指向IBM上返回503页的页面的链接。你认为你可以更新你的答案以包含相关信息,而不仅仅是一个链接吗?@MichaelT此链接仍然处于活动状态。。。。