[英]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.