在equals方法的一般契约中有一点,它表示如果你已经定义了equals()方法,那么你也应该定义hashCode()方法.如果o1.equals(o2)那时这是必须的o1.hashCode() == o2.hashCode().
所以我的问题是,如果我打破这份合同怎么办?在哪里可以带来失败时的情况o1.equals(o2),但o1.hashCode != o2.hashCode()?
HashMap/HashTable/HashSet/etc会根据它将你的对象放入几个桶中的一个桶中hashCode,然后检查该桶中是否有任何其他对象equal.
因为这些类假定等于/ hashCode合约,所以它们不会检查与其他存储桶中的对象的相等性.毕竟,另一个桶中的任何对象必须具有不同的hashCode,因此(通过契约)不能等于quesiton中的对象.如果两个对象equal具有不同的哈希码,则它们可能最终存在于不同的桶中,在这种情况下,HashMap/Table/Set/etc将没有机会比较它们.
所以,你最终可能会得到一个包含两个相等的对象的Set - 它不应该这样做; 或者包含同一个键的两个值的Map(因为桶是按键); 或者您无法查找键的Map(因为查找检查哈希码和相等); 或任何数量的类似错误.
| 归档时间: |
|
| 查看次数: |
641 次 |
| 最近记录: |