1. 方法定义

public boolean equals(Object obj)

2. 功能说明

  • 比较当前 Long 对象与指定对象是否相等
  • 相等条件需同时满足:
    1. 比较对象是 Long 类型(非 Integer 等其他类型)
    2. 两者包含相同的 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)
自动装箱 比较时支持 longLong 的自动装箱
缓存范围 -128127 的值使用缓存对象,但 equals() 不受影响

5. 常见错误与解决方案

  1. 错误:与 == 混淆

    Long a = 1000L;
    Long b = 1000L;
    
    System.out.println(a == b);       // false(引用比较)
    System.out.println(a.equals(b));  // true(值比较)
    

    解决:值比较始终使用 equals() 而非 ==

  2. 错误:跨类型比较

    Long id = 123L;
    Integer num = 123;
    
    System.out.println(id.equals(num)); // false(类型不同)
    

    解决:先转换为相同类型再比较

    System.out.println(id.equals(num.longValue())); // true
    
  3. 错误:空指针风险

    Long value = null;
    System.out.println(value.equals(123L)); // NullPointerException
    

    解决:使用安全比较方式

    System.out.println(123L.equals(value)); // 推荐写法(不会NPE)
    

6. 最佳实践

  1. 安全比较模式

    // 推荐写法(避免NPE)
    boolean isEqual = Long.valueOf(123).equals(target);
    
    // 替代方案
    boolean isEqual = Objects.equals(source, target);
    
  2. 高效缓存利用

    // 对常用值使用 valueOf() 缓存
    Long ADMIN_ID = Long.valueOf(100); // 重用缓存对象
    
  3. 与基本类型比较优化

    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(对象比较) 超出缓存范围时不可靠

核心原则

  1. 值比较始终使用 equals() 而非 ==
  2. Long 对象放在 equals() 左侧时需确保非空
  3. 跨类型比较需显式转换类型
  4. 高频比较推荐使用基本类型 long