如果我只需要比较对象,而且还没有计划将对象放入任何基于哈希的容器中,那么我是否只能实现equals()而不是hashCode()?
似乎所有的Java圣经都说这两个方法必须一起实现。 :(
我的担忧是: -如果我总是一起实现hashCode()和equals(),那么有很多代码实际上是没有用的,并且没有单元测试覆盖。 (如果不使用hashCode(),我不打算进行单元测试) -只有当我将对象放入基于哈希的容器中时,我才知道对象的查找方式。只有在那时,我才能确定使用哪种哈希策略。
如果我只需要比较对象,而且还没有计划将对象放入任何基于哈希的容器中,那么我是否只能实现equals()而不是hashCode()?
似乎所有的Java圣经都说这两个方法必须一起实现。 :(
我的担忧是: -如果我总是一起实现hashCode()和equals(),那么有很多代码实际上是没有用的,并且没有单元测试覆盖。 (如果不使用hashCode(),我不打算进行单元测试) -只有当我将对象放入基于哈希的容器中时,我才知道对象的查找方式。只有在那时,我才能确定使用哪种哈希策略。
equals
的通用合同:
如果两个对象根据equals(Object)方法是相等的,则在两个对象上调用hashCode方法必须产生相同的整数结果。
...这将导致奇怪的错误。即使您认为自己没有使用哈希码,任何您传递对象给的外部代码都可能依赖于它们,即使它似乎不是基于哈希的。如果您不打算给您的对象一个合理的哈希方法,至少让它抛出一个运行时异常。然而,最好还是给您的对象一个合理的hashCode。
Oracle的教程解答了这个问题。
hashCode()方法
根据定义,如果两个对象相等,则它们的哈希码也必须相等。如果您重写了equals()方法,则会更改比较两个对象的方式,而Object类中hashCode()方法的实现将不再有效。因此,如果您重写了equals()方法,则还必须重写hashCode()方法。
我只需要实现equals()方法而不用实现hashCode()方法吗?
是的,你可以。因为它们只是父类Object
中的两个方法,所以实现与否完全由你决定(可以同时实现或单独实现)。
所有Java圣经都说这两个必须一起实现。
如果你没有使用任何涉及hashcode
(如哈希容器)的内容,那么这不是一个必须的步骤。但是,为了避免出现意外情况,最好一起实现它们。
是的,你可以,但是推荐吗?不推荐
所有的书都说,如果equals返回true,则hashcode必须相同,这样才会成立。但是,最好为自己的实例进一步指定,就像你对equals所做的那样。
显然,你可以不使用哈希,但是你不打算使用哈希并不足以成为不实现它的理由。你使用的一些库可能会使用哈希。如果你想避免测试equals或hashcode,你可以尝试自动生成这些方法(大多数IDE都有这个功能),或者使用project lombok(https://projectlombok.org)。