提问者:小点点

将类与没有hashCode和equals的类实例进行比较


是否可以比较包含其他类实例、不包含hashCode和equals的类

我们有3个类别:汽车.java,SUV.java和TestFinal.java

汽车.java(没有哈希代码和等于的简单POJO)

public class Car
{
  private long carId;
  private String manufacturer;

  public Car(long carId, String manufacturer)
  {
    super();
    this.carId = carId;
    this.manufacturer = manufacturer;
  }

  /**
   * @return The carId.
   */
  public long getCarId()
  {
      return carId;
  }

  /**
   * @param carId The carId to set.
   */
  public void setCarId(long carId)
  {
      this.carId = carId;
  }

  /**
   * @return The manufacturer.
   */
   public String getManufacturer()
   {
      return manufacturer;
   }

  /**
   * @param manufacturer The manufacturer to set.
   */
  public void setManufacturer(String manufacturer)
  {
      this.manufacturer = manufacturer;
  }
}

SUV.java(包含汽车实例并包含哈希代码和等于)

public class SUV {
    private Car car;

    /**
     * @return The car.
     */
    public Car getCar()
    {
        return car;
    }

    /**
     * @param car The car to set.
     */
    public void setCar(Car car)
    {
        this.car = car;
    }

    public SUV(Car car)
    {
        super();
        this.car = car;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((car == null) ? 0 : car.hashCode());
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
        {
            return true;
        }
        if (obj == null)
        {
            return false;
        }
        if (getClass() != obj.getClass())
        {
            return false;
        }
        SUV other = (SUV) obj;
        if (car == null)
        {
            if (other.car != null)
            {
                return false;
            }
        }
        else if (!car.equals(other.car))
        {
            return false;
        }
        return true;
    } }

TestFinal是主要课程,我在这里比较两个SUV对象

public class TestFinal
{
    public static void main(String args[])
    {
        Car car1 = new Car(1, "Toyota");
        Car car2 = new Car(1, "Toyota");

        SUV suv1 = new SUV(car1);
        SUV suv2 = new SUV(car2);

        System.out.println(suv1.equals(suv2));
    }
}

这里

suv1.equals(suv2)

返回 false,因为 Car 不包含 equals 和 hashCode 的覆盖。有没有办法在不更改 Car 的情况下更新我的 SUV 覆盖逻辑(例如添加等于和哈希代码),以便

suv1.equals(suv2)

返回true

任何意见或建议都是有价值的。

谢谢!!


共3个答案

匿名用户

使用比较器接口也如下:

import java.util.Comparator;

public class CarComparator implements Comparator<Car>{

@Override
public int compare(Car o1, Car o2) {
    if(o1 == null || o2 == null){
        return -1;
    } else if(o1!=null && o2 == null){
        return -1;
    } else if(o1==null && o2!=null){
        return -1;
    } else{
        if(o1.getCarId() == o2.getCarId() && o1.getManufacturer().equals(o2.getManufacturer())){
            return 0;
        } else {
            return -1;
        }
    }
    
  }

}

那么对于SUV级别:

package test.corejava.concepts;

public class SUV {
private Car car;

/**
 * @return The car.
 */
public Car getCar() {
    return car;
}

/**
 * @param car
 *            The car to set.
 */
public void setCar(Car car) {
    this.car = car;
}

public SUV(Car car) {
    super();
    this.car = car;
}

/**
 * {@inheritDoc}
 */
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((car == null) ? 0 : car.hashCode());
    return result;
}

/**
 * {@inheritDoc}
 */
@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    SUV other = (SUV) obj;
    if (car == null) {
        if (other.car != null) {
            return false;
        }
    } else if (new CarComparator().compare(car, other.car)!=0) {
        return false;
    }
    return true;
  }

}

希望,这有帮助。

匿名用户

对于 equals 逻辑,您可以使用一个非常丑陋的解决方法:手动比较组成您正在比较的两个 SUV 对象的 Car 对象的相关属性。

基本上:

if(other.car.getManufacturer().equals(car.getManufacturers()))等。

我仍然强烈建议不要这样做 - 更不用说你会在使用hashCode时遇到的麻烦!!

另一种可能合适的方法是在实现 SUV等于哈希代码时删除 Car s 作为相关比较项,并确定两辆 SUV之间的相等不受其 Car的影响。

最后:难道< code>SUV不应该是一辆< code >轿车,而不是拥有一辆< code >轿车?

匿名用户

有没有办法在不更改Car的情况下更新SUV的覆盖逻辑(例如添加equals和hashCode)

不尽然,因为在您的< code>SUV.equals()方法中,您已经

else if (!car.equals(other.car))
{
    return false;
}

由于car. equals()没有被覆盖,它使用Object.equals()它只是比较对象是否相等。

好吧,您可以将该代码替换为单独比较car中的每个字段,但您真的想这样做吗?太难看了。最好只覆盖<code>Car.equals()</code>。