一、核心概念

Boolean 是 Java 中的包装类(Wrapper Class),位于 java.lang.Boolean 包中,用于封装基本数据类型 boolean 的值(truefalse)。

1.1 基本信息

属性 说明
类型 包装类(Wrapper)
所属包 java.lang.Boolean(无需导入)
继承 ObjectBoolean
实现接口 Comparable<Boolean>
封装类型 boolean(基本类型)
默认值 null(引用类型)

1.2 两种创建方式

  • 基本类型boolean flag = true;
  • 包装类型Boolean flag = true;(自动装箱)

1.3 自动装箱与拆箱(Autoboxing / Unboxing)

Java 5 引入特性,允许自动在 booleanBoolean 之间转换:

Boolean b1 = true;        // 自动装箱
boolean b2 = b1;          // 自动拆箱

⚠️ 注意:nullBoolean 拆箱会抛出 NullPointerException


二、操作步骤(超详细)

步骤 1:声明与初始化

// 方式1:直接赋值(推荐)
Boolean flag1 = true;
Boolean flag2 = false;

// 方式2:使用构造函数(已废弃,不推荐)
Boolean flag3 = new Boolean(true);     // 已过时(deprecated)
Boolean flag4 = new Boolean("true");   // 字符串构造,不推荐

// 方式3:静态工厂方法(推荐)
Boolean flag5 = Boolean.valueOf(true);
Boolean flag6 = Boolean.valueOf("true"); // 字符串转 Boolean

✅ 推荐使用 Boolean.valueOf(),因为它可以缓存常用值,提升性能。


步骤 2:字符串转 Boolean

String str = "True";

// 方法1:Boolean.valueOf(推荐)
Boolean b1 = Boolean.valueOf(str); // 忽略大小写,"true" 返回 true,其他返回 false

// 方法2:new Boolean(不推荐)
Boolean b2 = new Boolean(str);     // 同上,但不缓存,性能差

System.out.println(b1); // true
System.out.println(Boolean.valueOf("yes")); // false
System.out.println(Boolean.valueOf("1"));   // false

🔍 注意:只有字符串 "true"(忽略大小写)会被识别为 true,其余一律为 false


步骤 3:比较 Boolean 值

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

// 正确方式:使用 equals()
if (b1.equals(b2)) {
    System.out.println("b1 equals b2");
}

// 错误方式:使用 ==(可能出错,因为涉及对象引用)
if (b1 == b2) { ... } // ❌ 不推荐,除非确定是同一对象

// 安全比较(处理 null)
Boolean.compare(b1, b2); // 返回 int:0 相等,1/-1 不等

✅ 推荐使用 equals()Boolean.compare()


步骤 4:转换为基本类型

Boolean b = true;
boolean primitive = b.booleanValue(); // 拆箱

// 或直接赋值(自动拆箱)
boolean p2 = b;

⚠️ 如果 b == nullbooleanValue() 会抛出 NullPointerException


步骤 5:条件判断中的使用

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

// 安全写法
if (Boolean.TRUE.equals(flag)) {
    // 安全,即使 flag 为 null 也不会报错
}

// 危险写法
if (flag == true) { ... } // ❌ 可能空指针
if (flag) { ... }         // ❌ 编译错误,flag 是引用类型

✅ 推荐使用 Boolean.TRUE.equals(flag) 避免空指针。


三、常见错误

错误 说明 修复方式
NullPointerException nullBoolean 调用 .booleanValue()if (flag) 使用 equals() 或判空
使用 == 比较对象 Boolean b1 = true; Boolean b2 = true; b1 == b2 可能为 false(JVM 缓存机制不稳定) 使用 .equals()
误以为 "yes"true Boolean.valueOf("yes") 返回 false 明确只接受 "true" 字符串
使用构造函数 new Boolean(...) 已废弃,不缓存,性能差 改用 Boolean.valueOf()

四、注意事项

  1. Boolean 是引用类型,可以为 null,而 boolean 不能。
  2. 自动拆箱风险null 拆箱会抛出 NullPointerException
  3. 字符串解析严格:只有 "true"(忽略大小写)为 true,其他如 "on", "1", "yes" 都是 false
  4. 缓存机制Boolean.valueOf() 缓存了 TRUEFALSE 两个实例,节省内存。
  5. 线程安全Boolean 对象是不可变的(immutable),线程安全。

五、使用技巧

5.1 安全判空比较

public static boolean isTrue(Boolean flag) {
    return Boolean.TRUE.equals(flag);
}

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

5.2 默认值处理

Boolean input = getUserInput(); // 可能 null
boolean result = Boolean.TRUE.equals(input); // 默认 false
// 或
boolean result2 = input != null && input; // 显式判空

5.3 使用 Optional(Java 8+)

Optional<Boolean> opt = Optional.ofNullable(flag);
opt.ifPresent(b -> System.out.println("Flag is " + b));

六、最佳实践

实践 说明
✅ 使用 Boolean.valueOf() 创建实例 性能更好,利用缓存
✅ 使用 .equals() 比较 安全、正确
✅ 避免 null 拆箱 使用 equals 或判空
✅ 优先使用 boolean 而非 Boolean 除非需要 null 状态(如数据库映射)
✅ 明确字符串解析规则 不要依赖 "1""yes"true

七、性能优化

  1. 使用 valueOf() 而非 new Boolean()
    valueOf() 返回缓存实例,减少对象创建。

  2. 避免频繁装箱拆箱
    在循环中尽量使用 boolean 而非 Boolean

    // 慢
    for (int i = 0; i < 10000; i++) {
        Boolean b = i % 2 == 0;
        // ...
    }
    
    // 快
    for (int i = 0; i < 10000; i++) {
        boolean b = i % 2 == 0;
        // ...
    }
    
  3. 缓存常用 Boolean 对象
    Boolean.TRUEBoolean.FALSE 是常量,可直接使用:

    return someCondition ? Boolean.TRUE : Boolean.FALSE;
    

八、总结:Boolean 使用口诀

🔤 “值用 boolean,对象用 valueOf,比较用 equals,判空要小心”


九、附录:常用方法一览

方法 说明
Boolean.valueOf(boolean) 创建 Boolean 实例(推荐)
Boolean.valueOf(String) 字符串转 Boolean
booleanValue() 转为基本 boolean
equals(Object) 比较是否相等
compareTo(Boolean) 比较(用于排序)
toString() 返回 "true" 或 "false"
parseBoolean(String) 静态方法,返回 boolean 类型