例如,我有一个类Fruit.我创建了2个实例:
Fruit apple = new Fruit("apple");
Fruit orange = new Fruit("orange");
Run Code Online (Sandbox Code Playgroud)
2个实例的值不一样,因此我正在寻找错误的答案.我重写.equals()方法并编写以下方法来进行测试:
@Override
public boolean equals(Object otherObject){
if(otherObject instanceof Fruit){
return true;
}
return false;
}
if(apple.equals(orange))
System.out.println("true");
else
System.out.println("false");
Run Code Online (Sandbox Code Playgroud)
上面的方法给出了答案是正确的.根据我的理解,这是一个正确的响应,因为这只是测试它们是否属于同一个类是真的.
但我无法绕过测试实例本身的值.请指教.谢谢.
你应该包括你的Fruit课程,但这是一种方式
static class Fruit {
private String name;
public Fruit(String name) {
this.name = name;
}
@Override
public boolean equals(Object otherObject) {
// check for reference equality.
if (this == otherObject) {
return true;
}
if (otherObject instanceof Fruit) {
Fruit that = (Fruit) otherObject;
// Check for name equality.
return (name == null && that.name == null)
|| name.equals(that.name);
}
return false;
}
}
public static void main(String[] args) {
Fruit apple = new Fruit("apple");
Fruit apple2 = new Fruit("apple");
Fruit orange = new Fruit("orange");
if (apple.equals(orange))
System.out.println("true");
else
System.out.println("false");
// You can also use the shorter
System.out.println(apple.equals(apple2));
}
Run Code Online (Sandbox Code Playgroud)
输出
false
true
Run Code Online (Sandbox Code Playgroud)
由于 Java 使用隐式引用,因此您需要区分对象等同性和引用等同性。
如果你只是想知道两个对象是否对同一个内存单元进行 denode,所以它们真的是一样的,你可以使用 equals 运算符:
Object A = new Fruit("A");
Object B = new Fruit("A");
System.out.println(A == B);
Run Code Online (Sandbox Code Playgroud)
这将打印错误,因为 A 和 B 不是相同的参考单元格。
Object A = new Fruit("A");
Object B = A
System.out.println(A == B);
Run Code Online (Sandbox Code Playgroud)
将返回 true,因为它们都是指向同一引用单元格的“指针”。
如果你想实现语义相等,我建议你使用 equals 方法和类的字段。
Object A = new Fruit("A");
Object B = new Fruit("A");
System.out.println(A.equals(B));
Run Code Online (Sandbox Code Playgroud)
在这种情况下应该返回 true。
为了实现这一点,您可以对您可以编写的每个可能的类使用以下 equals 方法:(假设您有字段 A 的 getter 和 setter,并且您的类名为 myClass)
public boolean equals(Object B){
if(B instanceof MyClass){
MyClass B = (MyClass) B;
boolean flag = this.getA().equals(B.getA());
return flag;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
您必须为boolean flag = this.getA().equals(B.getA());班级的每个领域都做。如果对象字段具有相同的值,这将导致相等。
但是 oyu 必须记住,没有完美的 equals 方法。java中A.equals(B)有所谓的哈希码等于合同,这意味着必须持有,无论何时A.hashCode()==B.hashCode()
标志方法的一个好处是您不必关心对象字段的类型,对于不是对象(int、float 等)的基本类型,Java 运行时将执行隐式 bocing 和强制转换将它们转换为 Integer 或 Float 对象并使用它们的 equals 方法。
| 归档时间: |
|
| 查看次数: |
13784 次 |
| 最近记录: |