一、方法定义

public boolean equals(Object obj)
  • 所属类java.lang.Boolean
  • 参数Object obj —— 要比较的对象
  • 返回值true 如果 objBoolean 类型且值相等;否则返回 false
  • 重写自Object.equals()

二、功能说明

Boolean.equals() 用于判断当前 Boolean 对象是否与另一个对象在值上相等

它会:

  1. 检查传入对象是否为 null
  2. 检查传入对象是否为 Boolean 类型
  3. 比较两个 Boolean 的内部 boolean 值(truefalse

✅ 特点:安全、正确、可处理 null 参数


三、示例代码

示例 1:基本使用

Boolean b1 = true;
Boolean b2 = Boolean.valueOf("True"); // true
Boolean b3 = false;

System.out.println(b1.equals(b2)); // true
System.out.println(b1.equals(b3)); // false

示例 2:与 null 比较

Boolean b1 = true;
Boolean b2 = null;

System.out.println(b1.equals(b2)); // false(不会报错)
System.out.println(b2.equals(b1)); // ❌ 抛出 NullPointerException!

⚠️ 注意:null.equals(...) 会报错,但 非null.equals(null) 是安全的!

示例 3:与非 Boolean 类型比较

Boolean b1 = true;
String str = "true";

System.out.println(b1.equals(str)); // false(类型不同)

示例 4:静态常量比较(推荐写法)

Boolean flag = getUserEnabled(); // 可能返回 null

if (Boolean.TRUE.equals(flag)) {
    System.out.println("用户已启用");
}

✅ 这种写法即使 flag == null 也不会抛异常,非常安全。


四、使用技巧

✅ 技巧 1:用 Boolean.TRUE.equals(x) 避免空指针

// 安全写法(推荐)
if (Boolean.TRUE.equals(flag)) { ... }

// 危险写法(可能 NPE)
if (flag.equals(true)) { ... } // flag 为 null 时崩溃

✅ 技巧 2:封装判断工具方法

public class BooleanUtils {
    public static boolean isTrue(Boolean b) {
        return Boolean.TRUE.equals(b);
    }

    public static boolean isFalse(Boolean b) {
        return Boolean.FALSE.equals(b);
    }
}

使用:

if (BooleanUtils.isTrue(flag)) { ... }

✅ 技巧 3:结合 Optional 使用(Java 8+)

Optional.ofNullable(flag)
        .filter(b -> b.equals(true))
        .ifPresent(b -> System.out.println("Flag is true"));

五、常见错误

错误 说明 修复方式
NullPointerException 调用 null.equals(...) 改为 Boolean.TRUE.equals(obj)
使用 == 比较对象 b1 == b2 可能因对象不同返回 false 改用 .equals()
误认为 "true" 字符串等于 Boolean b.equals("true") 返回 false 明确类型转换
在条件中直接使用 Boolean if (flag) 编译错误 必须拆箱或比较

六、注意事项

  1. equals() 是实例方法,不能对 null 调用。
  2. 参数为 null 时返回 false,不会抛异常(这是安全的设计)。
  3. 只对 Boolean 类型返回 true,其他类型即使值相同也返回 false
  4. 大小写不敏感仅适用于字符串解析,不适用于 equals 比较
  5. 自动装箱不影响 equals 行为new Boolean(true).equals(true)true

七、最佳实践

实践 说明
✅ 优先使用 Boolean.TRUE.equals(obj) 安全、防 NPE
✅ 避免 obj.equals(true) obj 可能为 null 时危险
✅ 在工具类中封装判断逻辑 提高代码可读性和复用性
✅ 使用 equals() 而非 == 保证值比较而非引用比较
✅ 在集合中使用 equals 判断 list.contains(Boolean.TRUE)

八、性能优化

  1. Boolean.equals() 性能极高
    内部仅比较一个 boolean 值,无复杂逻辑。

  2. 避免在循环中频繁创建 Boolean 对象

    // 慢
    for (int i = 0; i < 10000; i++) {
        Boolean b = new Boolean(i % 2 == 0);
        if (b.equals(true)) { ... }
    }
    
    // 快
    for (int i = 0; i < 10000; i++) {
        boolean b = i % 2 == 0;
        if (b) { ... }
    }
    
  3. 使用常量 Boolean.TRUE/FALSE
    它们是单例,节省内存,比较更快。

  4. equals()compareTo() 更快
    如果只是判断相等,不要用 compareTo() == 0


九、扩展:Boolean.compare() 对比

方法 用途 是否支持 null 性能
equals() 判断相等 参数可为 null(返回 false
Boolean.compare(b1, b2) 静态方法,返回 int(用于排序) 不支持 null,会 NPE 稍慢

推荐:判断相等用 equals(),排序用 compare()


十、总结:Boolean.equals() 使用口诀

🔑 “判等用 equals,安全靠常量,null 放右边,避免调左边”