==和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()
方法比较的是字符串对象的内容,即它们的字符序列是否相同。
尽管 str1
和 str2
是不同的对象,但它们的内容相同,因此 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()
方法以比较对象的内容(姓名和年龄)。
person1
和 person2
的内容相同,因此它们返回 true
,而 person1
和 person3
的内容不同,因此它们返回 false
。
适用性的不同
==
通常更适用于比较基本数据类型,如整数和浮点数,或者用于检查两个对象是否是同一个实例。
equals()
更适用于比较引用类型,特别是自定义类、字符串和集合类等,用于比较对象的内容是否相等。
总的来说,==
和 equals()
有不同的用途和行为,你应该根据具体的比较需求来选择使用哪种方式。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》