hashCode()用于在HashMap中使用的对象数组

gew*_*izz 1 java hash

我有以下两个类,并想Foo1用作中的键HashMapFoo1如果两个对象相等,则两个对象相等;如果字节数组满足Foo2,则两个对象相等。Foo2Arrays.equals()

我不太清楚什么为做hashCode()的方法Foo1。我是否只需要总结每个Foo2对象的哈希码,还是效率低下?

public class Foo1 {

  Foo2[] foo2_array;

  @Override
  public boolean equals(Object Other) {

     for (int i = 0; i < foo2_array.length; i++) {

        if (!foo2_array[i].equals(other.foo2_array[i])
          return false;
     }

     return true;
   }

   @Override
   public int hashCode() {

      // what to here?
   }
}

public class Foo2 {

  byte[] values;

  @Override
  public boolean equals(Object other) {

      return Arrays.equals(values, other.values);
  }

  @Override
  public int hashCode() {

     return Arrays.hashCode(values);
  }
}
Run Code Online (Sandbox Code Playgroud)

mpr*_*hat 5

hashcode应该使用与equals不破坏合同相同的属性集。

只需使用Arrays.hashcode完成Foo2

另外,您不必遍历等式中的每个元素就可以使用 Arrays.equals

Foo2 equals看起来类似于Foo1.equals

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Foo1 other = (Foo1) obj;
        if (!Arrays.equals(foo2_array, other.foo2_array))
            return false;
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

和哈希码类似于Foo1哈希码

    @Override
    public int hashCode() {
        return Arrays.hashCode(foo2_array);
    }
Run Code Online (Sandbox Code Playgroud)

同样,在实现equals时,请检查是否存在相同的引用和对象有效性。