如果我只需要比较对象而还没有计划将对象放入任何基于散列的容器中,那么我只能实现等于(),而不能实现hashCode()吗?
似乎所有的Java圣经都说这两者必须一起实现。:(
我的关注点是:-If --我总是将hashCode()与equals()一起实现--会有很多代码没有真正使用,而且没有包含单元测试。(如果不使用的话,我不会对hashCode()进行单元测试)--直到我将对象放入基于哈希的容器时,我才知道如何查找对象。只有在那之前我才能确定使用哪种散列策略。
发布于 2015-05-04 08:56:33
你可以,但你会破坏总合同 of equals
如果两个对象根据equals(Object)方法相等,那么对两个对象中的每个对象调用hashCode方法都必须产生相同的整数结果。
..。这会导致奇怪的虫子。即使您不认为您在使用哈希代码,传递对象的任何外部代码也可能依赖于它们,即使它似乎不是基于散列的。如果您不打算为对象提供一个合适的散列方法,那么至少要让它抛出一个运行时异常。不过,给对象一个像样的hashCode几乎总是更好的。
发布于 2017-06-12 22:49:35
甲骨文的教程答案‘s
hashCode()方法 根据定义,如果两个对象相等,则它们的哈希代码也必须相等。如果重写equals()方法,则会改变两个对象被等同的方式,并且对象的hashCode()实现不再有效。因此,如果您重写了equals()方法,那么还必须重写hashCode()方法。
发布于 2015-05-04 08:55:28
只要不是强制实现hashCode、(无论何时实现相等),就必须实现hashCode
如果你不这样做,你最终会得到破碎的对象。为什么?对象的hashCode方法必须考虑与其相等方法相同的字段。通过重写等于方法,可以声明某些对象与其他对象相等,但是原始的hashCode方法将所有对象视为不同的对象。因此,您将拥有具有不同哈希代码的相同对象。例如,即使添加了对象,对HashMap的调用仍将返回false。
https://stackoverflow.com/questions/30026097
复制相似问题