在Java中,equals
方法与==
运算符的区别主要体现在以下方面:
1. 比较对象不同
-
==
运算符- 对基本数据类型比较值: a = = 5 a == 5 a==5
- 对引用类型比较内存地址:判断两个对象是否指向同一块内存
-
equals
方法- 专门用于对象间的内容比较
- 默认实现与
==
相同(继承自Object类) - 可通过重写实现自定义比较逻辑
2. 使用示例
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = s1;
System.out.println(s1 == s2); // false(不同内存地址)
System.out.println(s1.equals(s2)); // true(内容相同)
System.out.println(s1 == s3); // true(相同内存地址)
3. 特殊注意事项
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true(享元模式缓存)
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false(超出缓存范围)
4. 正确使用建议
- 基本类型:优先使用
==
- 对象比较:
- 需要比较内存地址时用
==
- 需要比较内容时用
equals
- 需要比较内存地址时用
- 空值处理:
Object obj = null; // System.out.println(obj.equals(null)); // 抛出NullPointerException System.out.println(obj == null); // 安全判断
5. 自定义对象示例
class Person {
String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
return Objects.equals(name, ((Person)o).name);
}
}
通过正确理解这些差异,可以有效避免常见的逻辑错误。记得比较包装类型时优先使用equals
,比较字符串时注意new String
与字面量的区别。