簡體   English   中英

用對象覆蓋 Java 中的 equals 方法

[英]Overriding the equals method in Java with objects

我目前正在練習面向對象編程,並且偶然發現在我的程序中使用 Override。 在這里,我想覆蓋類 Car 中的 equals 方法並使用 ONLY 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
    }
}

Java每個對象都有hashCode()方法,該方法返回一個int (對象的表示)。

在您的情況下,您想比較 licencePlate 哈希碼,例如:

@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 教程

您可以像這樣覆蓋 equals 類:

@Override
public boolean equals(Object o) {

    if (o == this)
        return true;

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


    Car that = (Car) o;

    return this.plateNumber.equals(that.plateNumber);
}

你必須使用

@Override
public boolean equals(Object o) {

    if (o == this)
        return true;

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


    Car that = (Car) o;

    return this.plateNumber.equals(that.plateNumber);
}

您只需執行plateNumber.equals(that.plateNumber)

package Lesson9.streamandoperations;

import java.util.Objects;

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 int hashCode() {

    return Objects.hash(plateNumber);
}

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Car other = (Car) obj;
        if (plateNumber == null) {
            if (other.plateNumber != null)
                return false;
        } else if (!plateNumber.equals(other.plateNumber))
            return false;
        return true;
    }

//    @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
    }
}

暫無
暫無

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

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