布尔数组标记筛选算法以boolean[]作开关表,索引映射元素状态,适用于索引可映射且范围确定的场景;典型三步为初始化全false、遍历标记true、二次扫描提取结果。

Java 中用布尔数组实现标记筛选算法,核心是用 boolean[] 作为“开关表”,每个索引对应一个元素的状态(true 表示选中/保留/已处理,false 表示跳过/剔除/未访问)。它轻量、高效、可读性强,特别适合范围有限、索引明确的筛选场景。
适用场景:索引可映射、范围确定
布尔数组筛选的前提是待处理对象能自然映射到连续整数索引(比如数字本身、数组下标、枚举序号等)。例如筛出 1~100 中的质数、标记字符串中重复出现的字符、记录某批订单 ID 是否已被处理(ID 是 1~N 的整数)。
- 若原始数据是
int[] nums = {2, 3, 5, 7, 11},你想标记哪些值在 [1,20] 内存在 → 可建boolean[] exists = new boolean[21](索引 0 不用,1~20 对应数值),遍历nums把对应位置设为true - 若处理的是字符串
"abac",想找出首次出现的字符 → 建boolean[256](ASCII 范围),遍历时检查seen[c]是否为false,是则记录并设为true
典型写法:初始化 + 遍历标记 + 二次扫描提取
三步结构清晰、不易出错:
-
初始化:根据最大可能索引 + 1 创建数组,初始全
false(表示未标记) -
标记阶段:遍历原始数据,对符合条件的元素,将其对应索引位置设为
true -
提取结果:再遍历布尔数组(或原始数据),按
true状态收集/跳过元素
示例:筛选数组中所有偶数并返回新数组
int[] arr = {1, 2, 3, 4, 5, 6};
boolean[] isEven = new boolean[arr.length]; // 索引 i 对应 arr[i]
// 标记偶数位置
for (int i = 0; i evens = new ArrayList();
for (int i = 0; i
<h3>内存与边界注意点</h3>
<p>布尔数组虽省内存(JVM 中单个 <code>boolean</code> 实际占 1 字节,但比 <code>int</code> 或 <code>Object</code> 小得多),仍需合理规划大小:</p>
- 索引不能越界:确保待标记的值在数组长度范围内,否则抛
ArrayIndexOutOfBoundsException。例如值最大为 1000,数组至少要new boolean[1001](索引 0 到 1000) - 稀疏数据慎用:如果有效索引分散且跨度极大(如只处理 ID 为 1、999999、10000000 的三条记录),布尔数组会浪费大量空间,此时改用
HashSet<integer></integer>更合适 - 默认值可靠:
boolean[]创建后自动初始化为false,无需手动循环赋值
进阶技巧:复用与状态叠加
单个布尔数组可承载多层逻辑,通过多次标记表达复合条件:
- 第一次遍历标记“出现过”,第二次遍历标记“出现次数 ≥ 2”,两个布尔数组配合使用
- 同一数组可先标记“合法范围”,再与“满足业务规则”做逻辑与:
valid[i] = valid[i] && meetsRule(arr[i]) - 避免反复 new 数组:对批量处理,可重用同一布尔数组,每次使用前用
Arrays.fill(flags, false)重置
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











