当前位置: 首页 > 知识库问答 >
问题:

equals方法对两个对象返回true,哈希方法对两个对象返回不同的值可以吗

潘宝
2023-03-14
class Name { 
    String first; 
    String last; 
    String middle;
}

我的业务规则是,如果第一个、最后一个和中间字段都相等,或者如果第一个和最后一个字段相等,并且其中一个(或两个)对象的中间字段为null,则两个Name对象被视为相等。

因此,在为我的Name类实现hash和equals方法时,我可以使用这样的用例:equals为两个对象返回true,但这两个对象的hash返回不同的值(因为一个对象的middle值为null值,而另一个对象的middle值为null)。

我使用的实际集合实现不能是HashSet,因为HashSet使用hash方法来确定是否将对象添加到集合中。在我的示例中,哈希方法将为这两个对象name1(First=Bruce,Last=Phillips,Middle=Allen)和name2(First=Bruce,Last=Phillips,Middle=Null)返回不同的值,尽管我的equals方法将为这两个对象返回true。

我的计划是使用TreeSet并让我的Name类实现可比。我实际上并不关心TreeSet中Name类对象的顺序,但是通过使用TreeSet并实现可比的compareTo方法,我可以使用class Name中的equals方法(检查其中一个对象的中间字段是否为null)来确定两个对象是否相等。

这种方法在解决我的需求时有什么缺点吗?

谢谢你的帮助。

布鲁斯

共有1个答案

楚畅
2023-03-14

来自Javadocs:

类对象的equals方法实现了对象间最具区分性的可能等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一个对象(x==y具有值true)时,此方法返回true。

请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的通用约定,该约定声明相同的对象必须具有相同的哈希代码。

 类似资料:
  • 我正在尝试使用方法,但它正在重新生成类的对象哈希代码,例如: 但是,我可以检索用户。没有任何问题和所有关系的专业知识: 这是我的Gson方法: 这是我的MyTypeAdapter: } 那么,如何让实际返回一个Json字符串,以便我可以使用Gson. FromJson在我的另一端?提前谢谢。

  • 问题内容: 我想从Java方法返回两个对象,并且想知道这样做的好方法是什么? 我能想到的可能的方法是:回报HashMap(因为这两个对象是相关的),或者返回的对象。 更准确地说,我要返回的两个对象是(a)对象和(b)相同名称的逗号分隔。 我想从一个方法返回这两个对象,因为我不想遍历对象列表以获得逗号分隔的名称(我可以在此方法的同一循环中执行此操作)。 不知何故,返回a 看起来不是很优雅的方式。 问

  • 本文向大家介绍两个对象值相同equals结果为true,但却可有不同的 hashCode,这句话对不对?相关面试题,主要包含被问及两个对象值相同equals结果为true,但却可有不同的 hashCode,这句话对不对?时的应答技巧和注意事项,需要的朋友参考一下 不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希值(hashCode)应当相同。Java 对于equals

  • 本文向大家介绍两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?相关面试题,主要包含被问及两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?时的应答技巧和注意事项,需要的朋友参考一下 不对,两个对象的 hashCode() 相同,equals() 不一定 true。 代码示例: 执行的结果: str1:1179395 |

  • 我在Hibernate中遇到了一个奇怪的问题。有两个数据库表存储活动票据和已解析票据。在Java中有一个超类(Ticket)和实体子类(ActiveTicket和ResolvedTicket)。 现在,当解析票据时,它将被移动到ResolvedTicket表。 现在我有了一个定制的findByID方法,我尝试首先检索活动票据,然后如果我有一个null对象,那么我尝试检索已解析票据。看起来是这样的:

  • 在MySQL中,我有3个表:Client、Room和ClientRoom,它指向前面的两个表。 使用python manage.py inspectdb 问题是,要创建ClientRoom对象,我需要Client和Room对象的id,而不是两个对象:一个Client和一个Room。 这对我来说是没有意义的,而且这也阻止了进一步的进展。我一直在做gui站点(在HTML上),它显示房间号,应该显示客户