如何检查2个Class实例是否相同

kar*_*kar 2 java equals

例如,我有一个类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)

上面的方法给出了答案是正确的.根据我的理解,这是一个正确的响应,因为这只是测试它们是否属于同一个类是真的.

但我无法绕过测试实例本身的值.请指教.谢谢.

Ell*_*sch 8

你应该包括你的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)


nes*_*eka 6

由于 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 方法。