Arrays.fill() 是初始化 Boolean 数组最直接高效的方式,填 true/false 安全复用常量对象,填 null 支持三态语义,但严禁使用 new Boolean(...) 避免引用共享陷阱;需区分 Boolean[] 与 boolean[] 的装箱开销和 null 支持差异。

Arrays.fill() 是初始化 Boolean 数组最直接高效的方式,但必须明确:它填的是 Boolean 对象引用,不是基本类型 boolean,且填入的值会被自动装箱,实际效果取决于你传的是 true、false 还是 null。
填 true / false:安全、常用、语义清晰
适用于标记“全部启用”或“全部禁用”等初始状态,JVM 会复用 Boolean.TRUE / Boolean.FALSE 常量对象,无共享风险:
-
✅ 推荐写法:
Boolean[] flags = new Boolean[10]; Arrays.fill(flags, true);→ 所有元素为Boolean.TRUE -
✅ 同样安全:
Arrays.fill(flags, false);→ 全为Boolean.FALSE - 注意:此时调用
flags[i] == true或Objects.equals(flags[i], true)均可安全判值,不会 NPE
填 null:显式表示“未设置”,需配合判空逻辑
适合需要三态语义(true / false / unknown)的场景,比如配置项未加载、API 返回值未解析:
-
✅ 显式初始化为 null:
Arrays.fill(flags, null);→ 所有元素为null - 后续使用时必须先判空:
if (flags[i] != null && flags[i]) { ... } - 避免直接解包:
if (flags[i])会触发 NullPointerException
填 new Boolean(...):绝对避免!引发严重共享陷阱
这是高频错误——误以为每次都会新建实例,实则只执行一次构造,所有数组元素指向同一对象:
-
❌ 危险写法:
Arrays.fill(flags, new Boolean(true));或Arrays.fill(flags, Boolean.valueOf(true)); - 后果:修改任一元素(如
flags[0] = false;)不影响其他位置;但若该 Boolean 实例被缓存复用(尤其在旧 JVM 中),逻辑可能异常 - 更糟的是:若填的是可变对象(如自定义包装类),改一个全变——Boolean 虽不可变,但这种写法违背语义且易误导后续维护者
与基本类型 boolean[] 的关键区别
别混淆 Boolean[] 和 boolean[]:
-
boolean[] raw = new boolean[5]; Arrays.fill(raw, true);→ 填的是原始值,无对象开销,JVM 默认就是 false,显式填 true 更具意图 -
Boolean[] boxed = new Boolean[5]; Arrays.fill(boxed, true);→ 填的是常量引用,内存轻量,但存在装箱/拆箱成本 - 选哪个?纯逻辑开关、高性能循环用
boolean[];需支持 null、参与泛型(如 List<Boolean>)、对接 JSON 反序列化等场景才用Boolean[]


















