
==和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年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。