Java中==和equals()的区别
题目描述
请详细说明Java中==和equals()的区别,并举例说明它们的使用场景。
核心知识点
1. == 运算符
==是Java中的比较运算符,用于比较两个变量的值。
- 基本数据类型: 比较的是实际的值
- 引用数据类型: 比较的是对象的内存地址(引用)
2. equals() 方法
equals()是Object类中定义的方法,用于比较两个对象的内容是否相等。
- 默认实现: Object类中的
equals()方法实际上就是使用==进行比较 - 重写: 大多数类(如String、Integer等)都重写了
equals()方法,用于比较对象的内容
详细解答
== 运算符的使用
java
// 基本数据类型比较
int a = 10;
int b = 10;
System.out.println(a == b); // true,比较的是值
// 引用数据类型比较
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false,比较的是内存地址equals() 方法的使用
java
// String类的equals()方法
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // true,比较的是内容
// 自定义类的equals()方法
class Person {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
}常见陷阱
1. String的常量池
java
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1 == s2); // true,都指向常量池中的同一个对象
System.out.println(s1 == s3); // false,s3是新创建的对象
System.out.println(s1.equals(s3)); // true,内容相同2. 包装类的比较
java
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true,-128到127之间的数会被缓存
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false,超出缓存范围
System.out.println(c.equals(d)); // true,使用equals()比较最佳实践
- 基本数据类型: 使用
==进行比较 - 引用数据类型:
- 比较引用是否相同:使用
== - 比较内容是否相同:使用
equals()
- 比较引用是否相同:使用
- 重写equals()时: 必须同时重写
hashCode()方法,遵循equals()和hashCode()的契约
相关题目
- String、StringBuilder、StringBuffer的区别
- HashMap的底层实现原理
- ConcurrentHashMap的实现原理
💡 提示: 理解
==和equals()的区别是Java基础中的重点,在面试中经常被问到。记住:==比较引用,equals()比较内容(需要正确重写)。