1. 方法定义
public boolean equals(Object obj)
2. 功能说明
- 比较当前
Long
对象与指定对象是否相等 - 相等条件需同时满足:
- 比较对象是
Long
类型(非Integer
等其他类型) - 两者包含相同的
long
值
- 比较对象是
- 重写了
Object.equals()
方法,提供值比较而非引用比较
3. 示例代码
public class LongEqualsExample {
public static void main(String[] args) {
Long num1 = 128L;
Long num2 = 128L;
Long num3 = 256L;
Integer num4 = 128;
// 相同值比较
System.out.println(num1.equals(num2)); // true
// 不同值比较
System.out.println(num1.equals(num3)); // false
// 不同类型比较
System.out.println(num1.equals(num4)); // false
// 自动装箱比较
System.out.println(num1.equals(128L)); // true(自动装箱为Long)
// null 安全比较
Long nullLong = null;
System.out.println(num1.equals(nullLong)); // false
}
}
4. 关键特性
特性 | 说明 |
---|---|
类型敏感 | 仅当对象为 Long 类型时才可能返回 true |
值比较 | 比较包装的 long 原始值是否相等 |
null处理 | 传入 null 时返回 false (不会抛NPE) |
自动装箱 | 比较时支持 long 到 Long 的自动装箱 |
缓存范围 | -128 到 127 的值使用缓存对象,但 equals() 不受影响 |
5. 常见错误与解决方案
错误:与
==
混淆Long a = 1000L; Long b = 1000L; System.out.println(a == b); // false(引用比较) System.out.println(a.equals(b)); // true(值比较)
解决:值比较始终使用
equals()
而非==
错误:跨类型比较
Long id = 123L; Integer num = 123; System.out.println(id.equals(num)); // false(类型不同)
解决:先转换为相同类型再比较
System.out.println(id.equals(num.longValue())); // true
错误:空指针风险
Long value = null; System.out.println(value.equals(123L)); // NullPointerException
解决:使用安全比较方式
System.out.println(123L.equals(value)); // 推荐写法(不会NPE)
6. 最佳实践
安全比较模式
// 推荐写法(避免NPE) boolean isEqual = Long.valueOf(123).equals(target); // 替代方案 boolean isEqual = Objects.equals(source, target);
高效缓存利用
// 对常用值使用 valueOf() 缓存 Long ADMIN_ID = Long.valueOf(100); // 重用缓存对象
与基本类型比较优化
long primitive = 123L; Long wrapped = 123L; // 高效比较(避免自动装箱) if (wrapped != null && wrapped == primitive) { // ... }
7. 性能说明
- 低开销:方法实现简单,仅包含类型检查和值比较
- 对比效率:
// 高效(推荐) a.equals(b) // 低效(避免使用) a.toString().equals(b.toString())
8. 源码分析
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
- 类型检查:先验证对象是否为
Long
类型 - 值提取:通过
longValue()
获取原始值比较 - 效率优化:直接使用
==
比较原始值
总结
场景 | 推荐方法 | 原因 |
---|---|---|
比较两个 Long 对象 |
a.equals(b) |
精确值比较,类型安全 |
比较 Long 和基本类型 |
a != null && a == prim |
避免不必要的自动装箱 |
可能包含 null 的比较 |
Objects.equals(a, b) |
空指针安全 |
避免使用场景 | a == b (对象比较) |
超出缓存范围时不可靠 |
核心原则:
- 值比较始终使用
equals()
而非==
- 将
Long
对象放在equals()
左侧时需确保非空- 跨类型比较需显式转换类型
- 高频比较推荐使用基本类型
long