一、核心概念与取值范围

1. 基本取值范围

  • 基本类型 boolean:严格限定两个值
    • true:逻辑真值
    • false:逻辑假值
  • 包装类 Boolean:三种可能值
    • Boolean.TRUE:表示 true 的对象
    • Boolean.FALSE:表示 false 的对象
    • null:未初始化的对象状态
// 基本类型取值范围
boolean isActive = true;  // 只能赋值为 true 或 false
boolean isValid = false;

// 包装类取值范围
Boolean obj1 = Boolean.TRUE;   // true 对象
Boolean obj2 = Boolean.FALSE;  // false 对象
Boolean obj3 = null;           // 特殊空状态

2. 内存表示

类型 内存占用 JVM 内部表示
boolean 未明确定义 通常用1字节
Boolean 16-24字节 对象头+引用

📌 关键认知:基本类型无 null,包装类有 null 风险

二、详细操作步骤

步骤1:声明与初始化

// 正确方式
boolean flag1 = true;          // 基本类型
Boolean flag2 = Boolean.FALSE; // 包装类(复用对象)
Boolean flag3 = Boolean.valueOf(true); // 静态工厂方法

// 错误方式(已过时)
Boolean deprecated = new Boolean(true); // 创建冗余对象

步骤2:值转换

// 字符串 → 布尔值
boolean b1 = Boolean.parseBoolean("true");  // true
boolean b2 = Boolean.parseBoolean("TRUE");  // true(不区分大小写)
boolean b3 = Boolean.parseBoolean("yes");   // false(仅"true"返回true)

// 布尔值 → 字符串
String s1 = Boolean.toString(true);   // "true"
String s2 = String.valueOf(false);    // "false"

步骤3:条件判断

// 基本类型判断(安全)
if (isActive) {
    // 执行操作
}

// 包装类判断(需空检查)
if (flag2 != null && flag2) {
    // 安全访问
}

步骤4:集合操作

// 基本类型集合(高效)
boolean[] flags = new boolean[10];
flags[0] = true;

// 包装类集合(允许null)
List<Boolean> boolList = new ArrayList<>();
boolList.add(true);
boolList.add(null); // 允许但危险

// 安全遍历
for (Boolean b : boolList) {
    if (b != null) {
        System.out.println(b ? "真" : "假");
    }
}

三、常见错误与解决方案

1. 空指针异常(NPE)

// 错误示例
Boolean obj = null;
if (obj) {  // 抛出 NullPointerException
    // ...
}

// 解决方案
if (obj != null && obj) {  // 空安全检查
    // ...
}

// 使用 Optional 更安全
Optional.ofNullable(obj).ifPresent(val -> {
    if (val) { /* 操作 */ }
});

2. 字符串解析陷阱

// 错误预期
System.out.println(Boolean.parseBoolean("True ")); // false(尾部空格)
System.out.println(Boolean.parseBoolean("1"));     // false(非true字符串)

// 正确处理
String input = " TRUE ".trim();
boolean value = "true".equalsIgnoreCase(input);

3. 自动装箱/拆箱问题

// 隐藏的NPE风险
Map<String, Boolean> map = new HashMap<>();
map.put("key", null);

boolean value = map.get("key");  // 自动拆箱抛出NPE

// 解决方案
Boolean wrapper = map.get("key");
if (wrapper != null) {
    boolean safeValue = wrapper;
}

四、使用技巧与最佳实践

1. 类型选择原则

graph TD
    A[需要布尔值] --> B{是否允许null?}
    B -->|否| C[使用基本类型 boolean]
    B -->|是| D{是否集合操作?}
    D -->|是| E[使用 Boolean + 空检查]
    D -->|否| F[考虑 Optional<Boolean>]

2. 性能优化技巧

// 优先基本类型(减少内存开销)
boolean[] flags = new boolean[10000]; // ~10KB

// 避免包装类集合(内存节省4-5倍)
Boolean[] objects = new Boolean[10000]; // ~40KB+

// 高频访问时缓存结果
public class Validator {
    private volatile Boolean cachedResult;
    
    public boolean isValid() {
        if (cachedResult == null) {
            cachedResult = computeExpensiveCheck();
        }
        return cachedResult;
    }
}

3. 框架集成实践

// JSON反序列化处理(Jackson示例)
public class Request {
    @JsonSetter(nulls = Nulls.SKIP)
    private Boolean flag = Boolean.FALSE; // 默认值处理
}

// 数据库映射(JPA)
@Entity
public class User {
    @Column(nullable = false)
    private boolean active; // 基本类型确保非空
    
    @Column
    private Boolean emailVerified; // 可为null
}

五、注意事项

  1. API 设计原则

    • 公开方法返回 boolean 而非 Boolean(避免调用方处理null)
    • 内部状态使用包装类时需显式初始化
  2. 序列化风险

    public class Config implements Serializable {
        private Boolean featureEnabled; // 反序列化时可能为null
    
        public boolean isFeatureEnabled() {
            return Boolean.TRUE.equals(featureEnabled); // 空安全
        }
    }
    
  3. 三态逻辑处理

    // 当需要true/false/unknown三态时
    public enum TriState {
        TRUE, FALSE, UNKNOWN
    }
    
    // 转换方法
    public static TriState toTriState(Boolean b) {
        if (b == null) return TriState.UNKNOWN;
        return b ? TriState.TRUE : TriState.FALSE;
    }
    

六、最佳实践总结

场景 推荐方案 理由
方法返回值 boolean 避免调用方处理null
集合元素 Boolean + 空检查 允许null值存储
高频计算的局部变量 boolean 无对象创建/拆箱开销
序列化传输 基本类型或设置默认值 防止反序列化NPE
条件判断 包装类前置 null 检查 消除NPE风险
配置参数 Boolean + Objects.requireNonNullElse 灵活处理缺失配置