对象的equals()方法与String对象和我创建的对象有什么不同?

ser*_*ent -1 java oop string methods equals

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

在案例2中,equals()方法比较类型和内容,并返回true(根据文档,它首先比较对象类型,然后比较内容).但是在第三种情况下,即使类型和内容相同,它也会返回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();

}

}
Run Code Online (Sandbox Code Playgroud)

You*_*bit 7

一般行为是,equals()Object类继承到所有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) 
Run Code Online (Sandbox Code Playgroud)

因为这里是equals()Object类中调用方法.其中仅检查引用相等.两个对象都是不同的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)
Run Code Online (Sandbox Code Playgroud)

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


如果要覆盖equals()任何类的行为,建议也重写hashCode()方法.