java - 用对象覆盖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
}
}
解决方案
每个对象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教程)
推荐阅读
- git - git中的全局配置和本地配置有什么区别?
- xml - 基于 XSLT 中的分组的计算问题
- macos - Apple SpeechRecognition 和听写占用超过 50% 的 CPU
- azure - 如何使用 terraform 资源提供者创建 azure 机器学习资源?
- c# - Handlebars C# if equals 比较
- excel - 不断收到运行时错误“5”VBA,这是什么问题?
- java - 将 Object[] 翻译成 Kotlin
- database - MongoDB 中的写入是如何发生的?
- c# - SqlException:DELETE 语句与 REFERENCE 约束“FK_Payment_Student”冲突
- python - 为什么 Print('1' == 1) 在 Python 中给出 False?