1

我有以下两个类,并希望Foo1用作HashMap. 如果两个Foo1对象相等Foo2,则两个对象相等,Foo2如果它们的字节数组满足,则对象相等Arrays.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);
  }
}
4

2 回答 2

5

hashcode应该使用与它相同的一组属性,equals以免违反合同。

只需使用Arrays.hashcodeas done inFoo2

此外,您不必遍历 equals 中的每个元素,您可以使用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;
    }

和类似于 Foo1 哈希码的哈希码

    @Override
    public int hashCode() {
        return Arrays.hashCode(foo2_array);
    }

此外,在实现 equals 时,请检查 null 的相同引用和对象有效性。

于 2012-05-25T04:36:56.797 回答
0

您本质上需要一些方法来使不同的对象可能具有不同的哈希码。

因此,根据您的数据,您不一定需要对数组中所有项目的哈希值求和。您基本上只需要“足以缩小范围”的东西。

我会这样说:你的数据有什么东西让你怀疑你不能只取数组中间值的哈希码吗?或者也许是第一个、最后一个和中间项目的组合哈希码,例如?

(会让您怀疑您无法做到这一点的事情:例如,如果您的数据具有某些特殊功能,使某个狭窄的值子集作为数组中的中间元素出现。)

于 2012-05-25T04:39:01.540 回答