[英]How to override equals() method
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()方法,在这里我将'id'和'name'属性用于对象比较和hashCode计算(因此,不可能有两个具有相同名称和ID的对象-因为按原样在此代码中-仅将“ id”属性用于对象比较)?
从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);
}
而不是使用
if (!(ob instanceof Car))
{
return false;
}
你应该考虑使用
if (getClass() != obj.getClass())
return false;
假设您有具有相同名称和ID的ForWdCar extends Car
和TwoWdCar extends Car
。
您是否希望他们平等? 第一种解决方案
您是否希望他们不平等? 第二解决方案
您不在乎,这样的情况不会发生吗? 第二种解决方案,它更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.