文档说:'hashCode不会被equals调用,反之亦然'。
但是阅读其他人的评论,他们实际上是。让我通过一个简单的例子来说明这一点。我有员工班。如果名称和ID相同,则Equal method返回true。而HashCode返回id。
那么现在会发生什么?我创建了一组员工,并添加了两个员工。一个具有ID 1和名称“ a”,另一个具有ID 1和名称“ b”。怎么了?他们两个都被添加。
显然,在JAVA看到它们在同一个存储桶中之后,就调用了equals。这不违反我第一句话中的文件吗?我想念什么吗?
谢谢
是,您缺少什么:
您的陈述是hashCode
方法不会调用equals
方法,反之亦然,通常是这样。
这并不意味着使用这些方法中的一种的其他代码不会调用另一种,事实上,通常是这种情况,例如使用hashCode最初将对象分配给“ box”的HashMap,然后然后使用equals方法进一步区分不同的对象。但这仍然不违反我的第一句话。
摘自Joshua Bloch的有效Java book
您必须在每个重写equals()的类中重写hashCode()。否则,将导致违反Object.hashCode()的常规协定,这将阻止您的类与所有基于哈希的集合(包括HashMap,HashSet和Hashtable)一起正常运行。
这意味着您需要同时覆盖equals()
类中的hashCode()
和Employee
,以便在Employee
中添加Set
的实例时,仅添加不同的实例。因为Java中的[Map
和Set
等Collections使用对象的相应hashcode
值(您所用情况下的Employee
的实例] >>)来确定如何在上述对象中存储它采集。稍后在检索期间,使用hashcode
以便从集合中检索唯一对象。