Java 对象的equals()方法与字符串对象和我创建的对象的作用不同?

Java 对象的equals()方法与字符串对象和我创建的对象的作用不同?,java,string,oop,methods,equals,Java,String,Oop,Methods,Equals,我对案例2和案例3中对象的.equals方法感到困惑。对于案例1,我可以理解引用和内容是相同的,所以我们分别得到了true和true 在案例2中,equals方法比较类型和内容,并根据文档返回true,它首先比较对象类型,然后比较内容。但是在第三种情况下,即使类型和内容相同,它也会返回False? 字符串对象有什么特殊的特性吗?任何帮助/提示/解释都将不胜感激 public class equalMethods { static class MyObject { String

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

在案例2中,equals方法比较类型和内容,并根据文档返回true,它首先比较对象类型,然后比较内容。但是在第三种情况下,即使类型和内容相同,它也会返回False? 字符串对象有什么特殊的特性吗?任何帮助/提示/解释都将不胜感激

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();

}

}

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

一般行为是,equals从对象类继承到所有java类及其默认实现中。所有类都应提供其对象所需的相等性。因此,如果您正在编写任何自定义类,通常是使用集合框架或实例相等的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) 
因为这里它是从对象类调用equals方法。它只检查引用的相等性。两个对象都是不同的,因此都是错误的

这里调用String类中的equals实现,它检查引用相等和内容相等,以便匹配并返回true


如果要为任何类重写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的对象类获得equals方法,这对您来说不是很有用。String类定义了一个equals方法

一旦你给一个鼠标一个相等的值,他就会想要一个哈希码


Java已经有了一个对象类。我知道,我改了,结果还是一样,但我得到了下面的答案。谢谢。当重写equals时,总是重写hashCode,反之亦然。非常感谢您的解释!我得到了它。
@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);
}
@Override
public int hashCode() {
    return this.name.hashCode();
}