这是我对hashcode和equals方法的理解:
- 如果obj1.hashcode == obj2.hashcode(返回true)则obj1.equals(obj2)返回true并且
- 如果obj1.equals(obj2)返回false(返回true)则obj1.hashcode == obj2.hashcode(返回false)
这是正确的吗?
答案 0 :(得分:1)
如果
obj1.hashcode
==obj2.hashcode
(返回true
),则obj1.equals(obj2)
可能会返回true
- 如果根据
equals(Object)
方法两个对象相等,则必须对两个对象中的每一个调用hashCode
方法 产生相同的整数结果。- 如果两个对象根据
equals(java.lang.Object)
方法不相等,则不需要调用hashCode
方法 两个对象中的每一个都必须产生不同的整数结果。 但是,程序员应该意识到产生了不同的 不等对象的整数结果可以提高性能 哈希表
答案 1 :(得分:1)
equals()
和hashCode()
之间的convention强制要求:
如果确定某个对象相等,则其哈希码必须* 相等。也就是说,如果obj1.equals(obj2)
,则为obj1.hashCode() == obj2.hashCode()
。
如果确定一个对象不相等,那么它们之间的哈希码应该没有硬性规则。他们可以返回相同的哈希码,但这可能会导致大量错误。
*:这个“必须”在编译时或运行时实际上是不可执行的,所以请耐心等待。请注意,如果未正确实施,则会使用equals
/ hashCode
用法来破坏应用程序的正确性。
答案 2 :(得分:1)
不正确。 Object.equals(Object)
的文档正式解释了扩展此方法的合同。基本上Object.equals
方法的意图是检查两个对象是否实际上是同一个对象。但是,覆盖此功能通常是有意义的,而是使您的类'equals
方法确定两个对象逻辑是否彼此相等(例如,两个不同的String对象实例,两者都是代表相同的句子。)
另一方面,Object.hashCode()
指定以下合同:
hashCode的一般合约是:
- 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须 如果没有使用任何信息,则始终返回相同的整数 等于对象的比较被修改。这个整数不需要 从应用程序的执行到另一个应用程序保持一致 执行相同的应用程序。
- 如果两个对象根据equals(Object)方法相等,则必须对两个对象中的每一个调用hashCode方法 产生相同的整数结果。
- 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要调用hashCode方法 两个对象中的每一个都必须产生不同的整数结果。 但是,程序员应该意识到产生了不同的 不等对象的整数结果可以提高性能 哈希表。
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术。)
基本上,两个不同的对象(逻辑上不同或技术上不同)可能具有相同的哈希码,因为哈希码是如何设计的,但它们不应该是“等于”。但是,如果两个对象彼此相等,则必须具有相同的哈希码。类似地,对象的哈希码只有在对象本身以某种方式发生变化时才会改变。
有关进一步阅读,请参阅hash functions上的维基百科文章。