==和equals()的区别(4大区别详解)

==和equals()的区别(4大区别详解)-mikechen

==和equals()的区别是Java面试经常被考的话题,下面我就重点详解4大==和equals()的区别@mikechen

比较的对象的区别

== 用于比较两个对象的引用(内存地址),即检查它们是否是同一个对象实例。

equals() 用于比较两个对象的内容,即检查它们的属性、值或内容是否相等。

如下所示:

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

boolean isEqualUsingEqualityOperator1 = (str1 == str2); // false,不同的对象
boolean isEqualUsingEqualityOperator2 = (str1 == str3); // true,同一个对象

在这个示例中,str1 和 str2 是两个不同的字符串对象,尽管它们的内容相同,但它们具有不同的引用。

str3 与 str1 共享相同的引用,因此它们是同一个对象。

 

默认行为的不同

默认情况下,== 比较对象的引用,而不是内容,这意味着即使两个对象具有相同的属性或内容,它们也会被认为不相等。

默认情况下,equals() 方法通常比较对象的引用,类似于 ==

但对于某些类,如 String 和许多集合类,equals() 方法被重写以实现内容比较。

如下所示:

String str1 = new String("Hello");
String str2 = new String("Hello");

boolean isEqualUsingEquals = str1.equals(str2); // true,内容相等

在这个示例中,equals() 方法比较的是字符串对象的内容,即它们的字符序列是否相同。

尽管 str1str2 是不同的对象,但它们的内容相同,因此 equals() 返回 true

 

自定义行为不同

你可以重写 equals() 方法以实现自定义的内容比较逻辑,这意味着你可以根据对象的类型和定义来定义相等性。

对于 == 运算符,有些编程语言允许你自定义它的行为,但不是所有编程语言都支持这样的操作。

如下所示:

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true; // 同一个实例
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false; // 不同的类或 null
        }
        Person person = (Person) obj;
        return age == person.age && name.equals(person.name); // 自定义内容比较
    }
}

public class EqualsExample {
    public static void main(String[] args) {
        Person person1 = new Person("Alice", 30);
        Person person2 = new Person("Alice", 30);
        Person person3 = new Person("Bob", 25);

        boolean isEqual1 = person1.equals(person2); // true,内容相等
        boolean isEqual2 = person1.equals(person3); // false,内容不相等
    }
}

在这个示例中,我们创建了一个自定义的 Person 类,并重写了 equals() 方法以比较对象的内容(姓名和年龄)。

person1person2 的内容相同,因此它们返回 true,而 person1person3 的内容不同,因此它们返回 false

 

适用性的不同

== 通常更适用于比较基本数据类型,如整数和浮点数,或者用于检查两个对象是否是同一个实例。

equals() 更适用于比较引用类型,特别是自定义类、字符串和集合类等,用于比较对象的内容是否相等。

总的来说,==equals() 有不同的用途和行为,你应该根据具体的比较需求来选择使用哪种方式。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法