一、方法定义
public boolean equals(Object obj)
- 所属类:
java.lang.Boolean
- 参数:
Object obj
—— 要比较的对象 - 返回值:
true
如果obj
是Boolean
类型且值相等;否则返回false
- 重写自:
Object.equals()
二、功能说明
Boolean.equals()
用于判断当前 Boolean
对象是否与另一个对象在值上相等。
它会:
- 检查传入对象是否为
null
- 检查传入对象是否为
Boolean
类型 - 比较两个
Boolean
的内部boolean
值(true
或false
)
✅ 特点:安全、正确、可处理
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) 编译错误 |
必须拆箱或比较 |
六、注意事项
equals()
是实例方法,不能对null
调用。- 参数为
null
时返回false
,不会抛异常(这是安全的设计)。 - 只对
Boolean
类型返回true
,其他类型即使值相同也返回false
。 - 大小写不敏感仅适用于字符串解析,不适用于 equals 比较。
- 自动装箱不影响 equals 行为,
new Boolean(true).equals(true)
为true
。
七、最佳实践
实践 | 说明 |
---|---|
✅ 优先使用 Boolean.TRUE.equals(obj) |
安全、防 NPE |
✅ 避免 obj.equals(true) |
当 obj 可能为 null 时危险 |
✅ 在工具类中封装判断逻辑 | 提高代码可读性和复用性 |
✅ 使用 equals() 而非 == |
保证值比较而非引用比较 |
✅ 在集合中使用 equals 判断 |
如 list.contains(Boolean.TRUE) |
八、性能优化
Boolean.equals()
性能极高
内部仅比较一个boolean
值,无复杂逻辑。避免在循环中频繁创建 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) { ... } }
使用常量
Boolean.TRUE/FALSE
它们是单例,节省内存,比较更快。equals()
比compareTo()
更快
如果只是判断相等,不要用compareTo() == 0
。
九、扩展:Boolean.compare()
对比
方法 | 用途 | 是否支持 null |
性能 |
---|---|---|---|
equals() |
判断相等 | 参数可为 null (返回 false ) |
快 |
Boolean.compare(b1, b2) |
静态方法,返回 int (用于排序) |
不支持 null ,会 NPE |
稍慢 |
推荐:判断相等用
equals()
,排序用compare()
。
十、总结:Boolean.equals() 使用口诀
🔑 “判等用 equals,安全靠常量,null 放右边,避免调左边”