== 和 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的碎碎念呀

