对象的 equals() 方法与 String 对象和我创建的对象的行为不同吗?

equals() method of objects is acting different with String objects and the Objects I created?

我对案例2和案例3中对象的.equals()方法感到困惑。对于案例1,我可以理解引用和内容是相同的,所以我们分别得到了true,true。

在情况2中,equals()方法比较了类型和内容,returns为真(根据文档,它先比较对象类型,然后再比较内容)。然而在第三种情况下,即使类型和内容相同,它 returns False! ? String 对象有什么特别之处吗?任何帮助/提示/解释表示赞赏。

public class equalMethods {

static class MyObject {

       String name;

    // constructor
    MyObject(String s) {
        this.name = s;
    }
}

public static void main(String[] args) {

    // ***CASE 1****
    String a = "str1"; 
    String b = "str1";
    System.out.println(a == b); // True
    System.out.println(a.equals(b));// True
    System.out.println();

    // ***CASE 2****
    String an = new String("oracle");
    String bn = new String("oracle");
    System.out.println(an == bn); // False
    System.out.println(an.equals(bn));// True ( ? Compare with case 3)
    System.out.println();

    // // ***CASE 3****
    MyObject object1 = new MyObject("str1");
    MyObject object2 = new MyObject("str1");
    System.out.println(object1 == object2); // False
    System.out.println(object1.equals(object2)); // False ( ? Compare with case 2) 
    System.out.println();

}

}

自定义 class 的最佳做法是覆盖默认的 equals 方法。 String 有一个 equals 方法。您需要为您的对象 class 编写一个。默认是比较内存中的引用,而不是字符串的内容。

一般行为是,equals()Object class 继承到所有 java class 及其默认实现。所有 classes 都应该为其对象提供所需的相等性。因此,如果您正在编写任何使用集合框架或使用实例相等性的自定义 class(通常是 POJO),那么您应该在各自的实例成员上实现 equals() 方法。

Object object1 = new Object("sam");
Object object2 = new Object("sam");
System.out.println(object1 == object2); // False
System.out.println(object1.equals(object2)); // False ( ? Compare with case 2) 

因为这里是从Objectclass调用equals()方法。仅检查引用相等性。两个对象都不同,因此 false.


String an = new String("oracle");
String bn = new String("oracle");
System.out.println(an == bn); // False
System.out.println(an.equals(bn));// True ( ? Compare with case 3)

此处调用了 String class 的 equals() 实现,它检查引用相等性和内容相等性,因此它匹配 returns true.


如果您要为任何 class 覆盖 equals() 的行为,建议也覆盖 hashCode() 方法。

您想在 MyObject def 中添加这样的内容:

@Override
public boolean equals(Object obj) {
    if (!(obj instanceof MyObject)) return false;
    if (obj == this) return true;
    MyObject that = (MyObject)obj;

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

否则你会从java的对象class中获取equals()方法,这对你来说用处不大。字符串 class 定义了一个 equals() 方法。

一旦你给老鼠一个equals(),他就会想要一个hashCode()...

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