簡體   English   中英

如何重寫equals()方法

[英]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 ,使得實施hashCodeequals容易。 假設您不想使用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 CarTwoWdCar extends Car

您是否希望他們平等? 第一種解決方案

您是否希望他們不平等? 第二解決方案

您不在乎,這樣的情況不會發生嗎? 第二種解決方案,它更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM