public class Car
{
private String name;
public int id;
public Car(String name, int id)
{
this.name = name;
this.id = id;
}
@Override
public boolean equals(Object ob)
{
if (!(ob instanceof Car))
{
return false;
}
Car that = (Car)ob;
return this.id == that.id;
}
@Override
public int hashCode()
{
return id;
}
// this class also got getters and setters
然后我又上了一堂课
public class CarList
{
private Collection<Car> cars;
public CarList()
{
cars = new HashSet<>();
}
public boolean insertCar(Car car)
{
return cars.add(car);
}
我的问题是:如何正确覆盖equals()和hashCode()方法,其中我考虑对象比较和hashCode计算的'id'和'name'属性(因此不可能有2个具有相同的对象名称和ID - 因为在这个代码中它只是 - 它只需要'id'属性进行对象比较)?
答案 0 :(得分:3)
从Java 7开始,Objects
上有静态方法,可以更轻松地实现hashCode
和equals
。这应该很有效,假设您不想使用getClass()
而不是instanceof
来确定类型兼容性。这取决于Car
的子类与Car
的比较。
@Override
public boolean equals(Object ob)
{
if (!(ob instanceof Car))
{
return false;
}
Car that = (Car)ob;
return Objects.equals(this.id, that.id) && Objects.equals(this.name, that.name);
}
@Override
public int hashCode()
{
return Objects.hash(id, name);
}
答案 1 :(得分:3)
而不是使用
if (!(ob instanceof Car))
{
return false;
}
你应该考虑使用
if (getClass() != obj.getClass())
return false;
让我们假设您ForWdCar extends Car
和TwoWdCar extends Car
具有相同的名称和身份。
你想让他们平等吗?第一个解决方案,
你想让他们不平等吗?第二个解决方案
你不在乎,这种情况不会发生吗?第二种解决方案,它更快。