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

4

2 回答 2

3

从 Java 7 开始,有一些静态方法Objects可以使实现变得hashCodeequals容易。这应该很好用,假设您不想使用getClass()而不是instanceof确定类型兼容性。这取决于子类Car应该如何与Cars 进行比较。

@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);
}
于 2013-10-28T19:02:57.557 回答
3

而不是使用

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

你应该考虑使用

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

让我们假设您有相同的名称ForWdCar extends CarTwoWdCar extends CarID。

你希望他们平等吗?第一种解决方案,

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

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

于 2013-10-28T19:12:10.150 回答