“==”和equal两种不同的比较方法

32 阅读1分钟

在 Java 中,equals() 方法和 == 运算符都可以用于比较两个对象是否相等,但它们的比较方式是不同的。

== 运算符比较的是两个对象的引用地址(指针),也就是说,它们是否指向同一块内存地址。例如:

String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");

System.out.println(str1 == str2); // true,两个对象引用同一字符串对象
System.out.println(str1 == str3); // false,两个对象引用不同的字符串对象

在这个例子中,str1 和 str2 引用同一字符串对象(“hello”),因此 == 返回 true。str1 和 str3 引用不同的字符串对象,因此 == 返回 false。

equals() 方法比较的是两个对象的内容(属性值),也就是说,它们的属性值是否相等。例如:

public class Person {
    private String name;
    private int age;

    // getters and setters

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;

        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }
}

Person person1 = new Person("Tom", 18);
Person person2 = new Person("Tom", 18);
Person person3 = new Person("Bob", 20);

System.out.println(person1.equals(person2)); // true,两个对象属性值相等
System.out.println(person1.equals(person3)); // false,两个对象属性值不相等

在这个例子中,我们重写了 equals() 方法,比较了两个 Person 对象的 name 和 age 属性是否相等。person1 和 person2 的属性值相等,因此 equals() 方法返回 true。person1 和 person3 的属性值不相等,因此 equals() 方法返回 false。

需要注意的是,当比较两个对象是否相等时,使用 == 运算符比较的是两个对象的引用是否相等,而使用 equals() 方法比较的是两个对象的内容是否相等。如果我们要比较两个对象的属性值是否相等,应该重写该对象的 equals() 方法,并在其中自定义比较语义。