如何重写equals()方法

时间:2013-10-28 18:52:30

标签: java

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'属性进行对象比较)?

2 个答案:

答案 0 :(得分:3)

从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);
}

答案 1 :(得分:3)

而不是使用

if (!(ob instanceof Car))
{    
  return false;
}

你应该考虑使用

if (getClass() != obj.getClass())
  return false;

让我们假设您ForWdCar extends CarTwoWdCar extends Car具有相同的名称和身份。

你想让他们平等吗?第一个解决方案,

你想让他们不平等吗?第二个解决方案

你不在乎,这种情况不会发生吗?第二种解决方案,它更快。