Equals说明未调用HashCode

问题描述 投票:0回答:2

文档说:'hashCode不会被equals调用,反之亦然'。

但是阅读其他人的评论,他们实际上是。让我通过一个简单的例子来说明这一点。我有员工班。如果名称和ID相同,则Equal method返回true。而HashCode返回id。

那么现在会发生什么?我创建了一组员工,并添加了两个员工。一个具有ID 1和名称“ a”,另一个具有ID 1和名称“ b”。怎么了?他们两个都被添加。

显然,在JAVA看到它们在同一个存储桶中之后,就调用了equals。这不违反我第一句话中的文件吗?我想念什么吗?

谢谢

java equals hashcode
2个回答
0
投票

是,您缺少什么:

您的陈述是hashCode 方法不会调用equals方法,反之亦然,通常是这样。

这并不意味着使用这些方法中的一种的其他代码不会调用另一种,事实上,通常是这种情况,例如使用hashCode最初将对象分配给“ box”的HashMap,然后然后使用equals方法进一步区分不同的对象。但这仍然不违反我的第一句话。


0
投票

摘自Joshua Bloch的有效Java book

您必须在每个重写equals()的类中重写hashCode()。否则,将导致违反Object.hashCode()的常规协定,这将阻止您的类与所有基于哈希的集合(包括HashMap,HashSet和Hashtable)一起正常运行。

这意味着您需要同时覆盖equals()类中的hashCode()Employee,以便在Employee中添加Set的实例时,仅添加不同的实例。因为Java中的[MapSetCollections使用对象的相应hashcode值(您所用情况下的Employee的实例] >>)来确定如何在上述对象中存储它采集。稍后在检索期间,使用hashcode以便从集合中检索唯一对象。

© www.soinside.com 2019 - 2024. All rights reserved.