我有一个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是一个抽象类,所以我有另外两个类BigCar
和SmallCar
扩展了Car抽象类。我的集合包含BigCar和SmallCar对象。
另请注意,这些子类不会覆盖equals和hashcode方法。
答案 0 :(得分:2)
在hashCode
方法中,这两个字段不会对称处理 - 因此交换current
和other
的两辆车不会使用相同的哈希码。
例如,您可以使用它(也请注意使用Objects::hash
来避免空检查):
@Override public int hashCode() {
return Objects.hash(current) * Objects.hash(other);
}
答案 1 :(得分:0)
好吧,在您的hashCode
current
和other
中不可互换。
在某些情况下,可以将current
的值表示为x
,将other
的值表示为y
。
hashCode
的值为31*(31+x)+y
。
现在,对于另一个实例,如果other
是x
而current
是y
(这意味着第二个实例应该等于第一个实例),{{ 1}}现在hashCode
对于31*(31+y)+x
和31*(31+x)+y
的大多数值都不等于x
。
因此,您违反了y
的合同,因为如果hashCode
,则a.equals(b) == true
必须等于a.hashCode()
。