一、方法定义
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 放右边,避免调左边”