hashCode()方法的对象的在HashMap中使用的阵列(hashCode() for an a

2019-06-24 19:13发布

我有以下两个阶级,要使用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);
  }
}

Answer 1:

你的hashcode为应使用同一组属性equals它不撕毁合同。

只需使用Arrays.hashcode在做Foo2

你也不要通过每个元素都在循环您等于你可以只使用Arrays.equals

foo2的平等可以像这样类似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;
    }

和hashCode类似Foo1哈希码

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

此外,同时实现equals做检查相同的参考和对象有效性空。



Answer 2:

你基本上是需要有一些方法,使得它有可能是不同的对象会有不同的散列码。

所以,这取决于你的数据,你不一定需要总结的阵列中的所有项目的哈希值。 你只需要基本的东西“不够好,缩小范围”。

我会把它是这样的:有关于你的任何数据,让你怀疑你不能只是拿,说,数组的中间值的哈希码? 或者,也许第一,最后和中间项的组合哈希码,例如?

(事情,会让你怀疑你不能做到这一点:如果说,你的数据有一些特殊的功能,使值的一定的极小部分出现的数组中的中间元素。)



文章来源: hashCode() for an array of objects for use in HashMap
标签: java hash