Java中 ==和equals的区别?
目录
1. ==
运算符
用法
==
是 比较运算符,它用于比较两个对象的 引用是否相同,即它们是否指向同一个内存地址。- 对于 基本数据类型,
==
比较的是变量的 值 是否相等。
对象的比较
对于对象类型(如 String
、Integer
、List
等),==
比较的是两个对象的内存地址,即它们是否是同一个对象。如果两个对象引用的是同一个内存地址,==
会返回 true
;如果它们是不同的对象,==
返回 false
。
示例:
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false,虽然它们的内容相同,但是它们是两个不同的对象,内存地址不同
在上面的代码中:
str1
和str2
是两个不同的String
对象,即使它们的内容(字符串 "hello")完全相同,它们的内存地址不同,因此==
运算符返回false
。
基本数据类型的比较
对于基本数据类型(如 int
、float
、char
等),==
比较的是值。
示例:
int a = 10;
int b = 10;
System.out.println(a == b); // true,因为它们的值相同
这里,a
和 b
的值都为 10,使用 ==
比较时会返回 true
,因为它们的值相同。
2. equals()
方法
用法
equals()
是 Object
类的方法,用于 比较两个对象的内容是否相同。每个类可以重写(Override)equals()
方法,定义自定义的对象比较逻辑。特别是像 String
、Integer
、List
等类,都会重写 equals()
方法,以便按内容比较对象。
- 默认情况下,在
Object
类中,equals()
方法的实现与==
相同,比较的是对象的内存地址,即引用是否相同。 - 但是,大多数类(如
String
)都会重写equals()
方法,比较的是对象的 内容 是否相同。
示例:
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // true,因为 String 类重写了 equals(),比较的是内容
在这个例子中:
str1
和str2
虽然是两个不同的对象(它们的内存地址不同),但它们的内容相同,所以equals()
返回true
。
equals()
的重写
equals()
方法通常会根据对象的内容来判断两个对象是否相等,通常会检查对象的字段值是否相同。这是很多类(如 String
、Integer
、Date
等)重写 equals()
方法的原因。
自定义类中的 equals()
重写:
如果你有一个自定义的类(比如 Person
类),你通常会重写 equals()
方法来比较对象的内容。
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写 equals 方法
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // 如果是同一个对象,返回 true
if (obj == null || getClass() != obj.getClass()) return false; // 检查类型和空值
Person person = (Person) obj;
return age == person.age && name.equals(person.name); // 比较内容
}
public static void main(String[] args) {
Person p1 = new Person("Alice", 30);
Person p2 = new Person("Alice", 30);
Person p3 = new Person("Bob", 25);
System.out.println(p1.equals(p2)); // true,内容相同
System.out.println(p1.equals(p3)); // false,内容不同
}
}
在这个例子中,equals()
方法被重写用来比较 Person
对象的 name
和 age
字段。如果这两个字段都相同,equals()
返回 true
;否则返回 false
。
3. ==
和 equals()
的实际区别
操作符/方法 | 用途 | 比较内容 | 默认行为 | 重写后的行为 |
---|---|---|---|---|
== | 比较引用是否相同 | 基本数据类型:值;对象:引用(内存地址) | 比较对象的内存地址 | 默认与 equals() 相同,比较内存地址 |
equals() | 比较对象内容是否相同 | 比较对象的内容(通常根据类的字段比较) | 默认比较内存地址 | 根据类的定义比较对象的实际内容 |
示例:==
和 equals()
的区别
public class TestComparison {
public static void main(String[] args) {
// 创建两个不同的 String 对象
String str1 = new String("hello");
String str2 = new String("hello");
// 使用 == 比较
System.out.println(str1 == str2); // false,因为它们是不同的对象,内存地址不同
// 使用 equals() 比较
System.out.println(str1.equals(str2)); // true,因为它们的内容相同
// 使用基本数据类型比较
int a = 100;
int b = 100;
System.out.println(a == b); // true,因为值相同
// 使用自定义对象比较
Person p1 = new Person("Alice", 30);
Person p2 = new Person("Alice", 30);
System.out.println(p1 == p2); // false,因为它们是不同的对象,内存地址不同
System.out.println(p1.equals(p2)); // true,因为它们的内容相同
}
}
小结:
==
比较的是两个引用是否指向同一个对象(即内存地址是否相同)。equals()
比较的是两个对象的 内容 是否相同,通常是通过重写equals()
方法来根据对象的字段值进行比较。- 对于基本数据类型,
==
比较的是 值,而不是引用。
原文地址:https://blog.csdn.net/cmh1008611/article/details/143693971
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!