Java hashcode/equals的正确实现

Java hashcode/equals的正确实现,java,Java,我有一节课 class Pair<T>{ private T data; private T alternative; } 但是,我很难正确实现hashCode()部分。任何建议都将不胜感激这应该可以做到: @Override public int hashCode() { return data.hashCode() * alternative.hashCode(); } 由于要将这两个字段都包含在equals中,因此需要将这两个字段都包含在

我有一节课

class Pair<T>{
    private T data;
    private T alternative;
}

但是,我很难正确实现hashCode()部分。任何建议都将不胜感激

这应该可以做到:

  @Override
  public int hashCode() {
    return data.hashCode() * alternative.hashCode();
  }

由于要将这两个字段都包含在equals中,因此需要将这两个字段都包含在
hashCode
方法中。如果不相等的对象最终具有相同的哈希代码,则这是正确的,但是根据您的方案,相等的对象使用此方法将始终具有相同的哈希代码。

这应该可以做到:

  @Override
  public int hashCode() {
    return data.hashCode() * alternative.hashCode();
  }

由于要将这两个字段都包含在equals中,因此需要将这两个字段都包含在
hashCode
方法中。如果不相等的对象最终具有相同的哈希代码,则这是正确的,但根据您的方案,相等的对象最终将始终具有相同的哈希代码,使用此方法。

您应该使用数据中的哈希代码,或者类似以下的替代方法:

  return this.data.hashCode() + this.alterative.hashCode();

虽然这不是最好的方法,但是如果您更改了数据或备选方案,那么它们的哈希代码也会更改。想一想,看看您是否真的需要将该类用作映射中的键,如果不是长的或字符串,则更适合使用。

您应该使用数据中的哈希代码和如下替代方法:

  return this.data.hashCode() + this.alterative.hashCode();

虽然这不是最好的方法,但是如果您更改了数据或备选方案,那么它们的哈希代码也会更改。想一想,看看您是否真的需要将这个类用作映射中的键,如果不是长的或字符串,则更适合使用。

参考java文档,hashCode的一般约定是(从java文档复制):


因此,从equals的实现来看,数据和备选方案是可切换的。因此,如果切换data.hashCode()和alternative.hashCode()的位置,则需要确保在hashCode实现中返回相同的值。如果您不确定,只需返回常量值,如1(但当您尝试将对象放入映射时,可能会导致性能问题)

参考java文档,hashCode的总合同是(复制自java文档):

因此,从equals的实现来看,数据和备选方案是可切换的。因此,如果切换data.hashCode()和alternative.hashCode()的位置,则需要确保在hashCode实现中返回相同的值。如果您不确定,只需返回常量值,如1(但当您尝试将对象放入映射时,可能会导致性能问题)