首页 > 解决方案 > 用对象覆盖Java中的equals方法

问题描述

我目前正在练习面向对象的编程,并且偶然发现在我的程序中使用 Override。在这里,我想重写 Car 类中的 equals 方法,并仅使用 plateNumber 来确定 Car 是否相同(相等)。

虽然它提供了所需的输出,但它没有使用布尔结果而且我不得不使用 CharSequence 来比较它。在这种情况下如何使用字符串比较?

class Car {
    private String make;
    private String model;
    private String plateNumber;
    private int horsePower;

    public Car(String make, String model, String plateNumber, int horsePower) {
        this.make = make;
        this.model = model;
        this.plateNumber = plateNumber;
        this.horsePower = horsePower;
    }


    public String getMake() {
        return make;
    }

    public void setMake(String make) {
        this.make = make;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getPlateNumber() {
        return plateNumber;
    }

    public void setPlateNumber(String plateNumber) {
        this.plateNumber = plateNumber;
    }

    public int getHorsePower() {
        return horsePower;
    }

    public void setHorsePower(int horsePower) {
        this.horsePower = horsePower;
    }

    @Override
    public boolean equals(Object o) {

        if (o == this)
            return true;

        if (!(o instanceof Car))
            return false;


        Car that = (Car) o;

        return CharSequence.compare(plateNumber, that.plateNumber) == 0;
    }
}

class Main {
    public static void main(String args[]) {

        Car car1 = new Car("Toyota", "RAV4", "ABC-123", 104);
        Car car2 = new Car("Renault", "Megane", "DEF-789", 132);
        Car car3 = new Car("Ford", "Mondeo", "GHI-012", 132);
        Car car4 = new Car("Mercedes", "C180", "ABC-123", 144);


        if (car1.equals(car4)) {
            System.out.println("Equal ");
        } else {
            System.out.println("Not Equal ");
        }

        boolean result = car1.equals(car4);// this should return true because the plateNumbers are the same
        result = car1.equals(car2); // this should return false because the plateNumbers don't match
    }
}

标签: javaoop

解决方案


每个对象Java都有hashCode()返回一个int(对象的表示)的方法。

在您的情况下,您想比较 licencePlate hashCodes,例如:

@Override
public boolean equals(Object o) {

    if (o == this)
        return true;

    if (!(o instanceof Car))
        return false;

    Car that = (Car) o;
    return Objects.equals(this.hashCode(), that.hashCode());
}

@Override
public int hashCode() {
    return this.plateNumber.hashCode();
}

现在要比较不同的字段,您将需要素数(这篇文章清楚地解释了原因)

@Override
public int hashCode() {
    int prime = 31; //Prime1
    int hash = 7; //Prime2
    hash = prime * hash + (int) id;
    hash = prime * hash + (plateNumber == null ? 0 : plateNumber.hashCode());
    hash = prime * hash + (make == null ? 0 : make .hashCode());
    return hash;
}

有用的链接(Baeldung教程


推荐阅读