对象比较的一般契约:equals()和hashCode()

Ars*_*yan 2 java

在equals方法的一般契约中有一点,它表示如果你已经定义了equals()方法,那么你也应该定义hashCode()方法.如果o1.equals(o2)那时这是必须的o1.hashCode() == o2.hashCode().

所以我的问题是,如果我打破这份合同怎么办?在哪里可以带来失败时的情况o1.equals(o2),但o1.hashCode != o2.hashCode()

Jig*_*shi 5

它将导致基于散列的数据结构中的意外行为,例如:HashMap,阅读HashTable的工作原理


ysh*_*vit 5

HashMap/HashTable/HashSet/etc会根据它将你的对象放入几个桶中的一个桶中hashCode,然后检查该桶中是否有任何其他对象equal.

因为这些类假定等于/ hashCode合约,所以它们不会检查与其他存储桶中的对象的相等性.毕竟,另一个桶中的任何对象必须具有不同的hashCode,因此(通过契约)不能等于quesiton中的对象.如果两个对象equal具有不同的哈希码,则它们可能最终存在于不同的桶中,在这种情况下,HashMap/Table/Set/etc将没有机会比较它们.

所以,你最终可能会得到一个包含两个相等的对象的Set - 它不应该这样做; 或者包含同一个键​​的两个值的Map(因为桶是按键); 或者您无法查找键的Map(因为查找检查哈希码和相等); 或任何数量的类似错误.