有过 我已经看到了很多关于不在Java中覆盖hashCode的问题,但是我得到了它, 但在这种稍微不同的情况下会发生什么:
hashCode = 1且equals未被覆盖。
似乎没有违反HashCode合约 - 我们为相同的对象返回相同的hashCode。 但是这种实现允许添加重复键并为逻辑上相等的键重新调整null。 另一方面,时间:
hashCode = 1和@Override equals()
它运作得很好。 我很难弄清楚这两种情况下发生了什么。
答案 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
。