== 和 equals() 的区别 -Java
在Java中,==
和 equals()
是两个常用的比较操作符,它们用来比较对象,但它们的工作原理和适用场景有显著的不同。
1. ==
运算符
==
是一个比较操作符,主要用于:
- 基本数据类型的比较:它比较的是两个变量存储的值是否相等。
- 对象的引用比较:它比较的是两个对象的引用(即内存地址)是否相同,即判断两个引用是否指向同一个对象。
基本数据类型的比较
对于基本数据类型(如int
、float
、char
等),==
比较的是它们存储的实际值。
代码示例:
public class EqualOperatorExample {
public static void main(String[] args) {
int a = 10;
int b = 10;
System.out.println(a == b); // true, 比较的是值,10 == 10
}
}
对象引用的比较
对于对象,==
比较的是对象的引用地址,即判断两个对象是否是同一个对象。
代码示例:
public class EqualOperatorExample {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
// 比较对象的引用地址,str1 和 str2 并不是同一个对象
System.out.println(str1 == str2); // false
}
}
说明:
str1 == str2
返回false
,因为str1
和str2
指向的是两个不同的对象,虽然它们的内容一样,但它们在内存中的地址不同。==
只是比较对象的引用地址,而不是内容。
2. equals()
方法
equals()
是 Object
类中定义的方法,用于比较两个对象的内容是否相同。大多数类(例如 String
、Integer
等)会重写该方法,以便按对象的实际内容进行比较。
默认实现
默认情况下,equals()
方法比较的是对象的引用地址(即与 ==
相同)。但许多类(如 String
、List
等)重写了该方法,以便比较对象的内容而不是引用地址。
示例:String
类重写了 equals()
方法
在 String
类中,equals()
被重写为比较字符串内容是否相同。
代码示例:
public class EqualsMethodExample {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
// 比较字符串的内容
System.out.println(str1.equals(str2)); // true
}
}
说明:
str1.equals(str2)
返回true
,因为String
类重写了equals()
方法,它会比较字符串的内容,而不是它们的引用地址。
3. 总结比较:==
与 equals()
用途 | 比较基本数据类型的值,或者对象的引用地址 | 比较对象的内容(通过 equals() 重写时) |
基本数据类型 | 比较值是否相等 | 不适用,基本类型不能调用 equals() 方法 |
对象 | 比较引用是否指向同一个对象 | 比较对象的内容(需类重写 equals() 方法) |
默认行为 | 默认比较引用地址(对象的内存位置) | 默认比较引用地址,除非类重写该方法进行内容比较 |
适用场景 | 适用于基本数据类型和对象引用比较 | 适用于对象的内容比较(字符串、集合等) |
4. equals()
方法的重写
对于自定义类,如果希望 equals()
方法比较对象的内容而不是引用地址,需要重写 equals()
方法。常见的重写 equals()
方法的步骤如下:
- 使用
instanceof
检查类型:确保比较的对象类型相同。 - 比较属性:逐一比较对象的关键属性。
代码示例:
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;
// 强制转换为 Person 对象
Person person = (Person) obj;
// 比较两个 Person 对象的属性
return name.equals(person.name) && age == person.age;
}
}
public class EqualsMethodOverrideExample {
public static void main(String[] args) {
Person person1 = new Person("Alice", 25);
Person person2 = new Person("Alice", 25);
// 通过重写的 equals() 方法比较对象内容
System.out.println(person1.equals(person2)); // true
}
}
说明:
equals()
方法首先判断是否为同一个对象,如果是,直接返回true
。- 然后判断是否是相同类型的对象,再逐一比较每个属性,最后返回比较结果。
5. hashCode()
和 equals()
的关系
在Java中,equals()
和 hashCode()
方法是相互关联的。根据 Java 的合同规则,如果两个对象通过 equals()
方法比较相等,那么它们的 hashCode()
也必须相等。否则,可能会导致集合(如 HashMap
、HashSet
)中的问题。
- 如果两个对象相等(
equals()
为true
),那么它们的hashCode()
必须相同。 - 如果两个对象的
hashCode()
相同,并不一定意味着它们相等。
6. 总结
==
比较基本数据类型的值,或者对象的引用地址。equals()
比较对象的内容,通常需要重写,尤其是在自定义类中。- 通过重写
equals()
方法,可以根据对象的实际内容来比较对象。
Java碎碎念 文章被收录于专栏
来一杯咖啡,聊聊Java的碎碎念呀