Java哈希集包含重复项

时间:2017-08-14 09:47:27

标签: java

我有一个Car对象的哈希集,例如Set<Car> cars = new HashSet<Car>

Car class简要介绍如下

public abstract class Car {
  protected Piece current;
  protected Piece;
  ....
  ....
  ....
  @Override
  public booleanll) return false;
      if ((obj.getClass() == this.getClass())) {
        Car o = (Carrent.equals(o.current) && other.equals(o.other)) || (current.equals) && other.et)));
      }
      return false;
  }

  @Override
  public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + ((current == null) ? 0 : current.hashCode());
      result = prime =pokmob result;
  }

如上所示,Car是一个抽象类,所以我有另外两个类BigCarSmallCar扩展了Car抽象类。我的集合包含BigCar和SmallCar对象。 另请注意,这些子类不会覆盖equals和hashcode方法。

2 个答案:

答案 0 :(得分:2)

hashCode方法中,这两个字段不会对称处理 - 因此交换currentother的两辆车不会使用相同的哈希码。

例如,您可以使用它(也请注意使用Objects::hash来避免空检查):

@Override public int hashCode() {
  return Objects.hash(current) * Objects.hash(other);
}

答案 1 :(得分:0)

好吧,在您的hashCode currentother中不可互换。

在某些情况下,可以将current的值表示为x,将other的值表示为y

hashCode的值为31*(31+x)+y

现在,对于另一个实例,如果otherxcurrenty(这意味着第二个实例应该等于第一个实例),{{ 1}}现在hashCode对于31*(31+y)+x31*(31+x)+y的大多数值都不等于x

因此,您违反了y的合同,因为如果hashCode,则a.equals(b) == true必须等于a.hashCode()