不清楚hashCode合同违规

时间:2015-11-04 09:41:59

标签: java equals hashcode

有过 我已经看到了很多关于不在Java中覆盖hashCode的问题,但是我得到了它, 但在这种稍微不同的情况下会发生什么:

hashCode = 1且equals未被覆盖。

似乎没有违反HashCode合约 - 我们为相同的对象返回相同的hashCode。 但是这种实现允许添加重复键并为逻辑上相等的键重新调整null。 另一方面,时间:

hashCode = 1和@Override equals()

它运作得很好。 我很难弄清楚这两种情况下发生了什么。

1 个答案:

答案 0 :(得分:5)

假设您要求将您的班级用作________________________________ test_test001 _________________________________ ... ________________________________ test_test002 _________________________________ def test_test002(): > assert df1==df3 untitled0.py:22: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = CustomerID CustomerAltID CustomerName Gender 0 True True ... True True True 14 True True True True def __nonzero__(self): raise ValueError("The truth value of a {0} is ambiguous. " "Use a.empty, a.bool(), a.item(), a.any() or a.all()." > .format(self.__class__.__name__)) E ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a. bool(), a.item(), a.any() or a.all(). ..\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\core\generic.py:714 : ValueError ========================== 2 failed in 6.54 seconds ===========================

中的密钥

在第一个方案中,由于HashMap未被覆盖,equals当且仅当a.equals(b)时才会被覆盖。因此,这种实现允许"逻辑"重复,因为两个不同的实例可能对其所有属性具有完全相同的值,但它们仍然不被视为彼此相等。

在第二种情况下,当覆盖a==b时,您的实现将确定同一类中的两个对象何时彼此相等。

这两种情况都不违反equals的合同,但由于hashCode始终返回1,因此在hashCode或作为元素作为键时,两者都会有糟糕的表现在HashMap中,因为所有键都会映射到同一个bin,而HashSet将成为HashMap\HashSet