bitset.cardinality() 是统计 bitset 中 true 位个数的最高效方法,时间复杂度约 o(n/64),返回 int 值,准确计数已设置位,无需手动遍历,注意线程不安全。
bitset.cardinality() 是 java 中最直接、高效统计位图中 已设置为 true 的位数 的方法,它内部通过优化的位运算(如查表法或 swar 技术)实现,时间复杂度接近 o(n/64),远优于手动遍历。
确认 BitSet 已正确初始化并设置所需位
cardinality() 统计的是当前实际被设为 true 的位个数,与 BitSet 容量无关。未显式设置的位默认为 false,不计入结果。
- 使用
set(int index)或set(int fromIndex, int toIndex)设置目标位 - 避免误用
clear()后未重设,导致统计值偏小 - 示例:bitSet.set(0); bitSet.set(3); bitSet.set(7); →
cardinality()返回 3
直接调用 cardinality() 获取实时计数值
无需额外循环或临时变量,调用即得结果,线程不安全场景下需注意并发修改(若 BitSet 被多线程共享,应加同步或改用线程安全替代方案)。
- 返回值为
int类型,表示已置位总数 - 即使 BitSet 内部数组扩容(如设置了高位索引),该方法仍准确统计所有
true位 - 示例:int count = bitSet.cardinality();
对比手动遍历:为什么不要自己写 for 循环
手动遍历不仅代码冗长,还容易出错(如越界、漏判、性能差),尤其在稀疏或超大 BitSet 场景下差距显著。
- 错误示范:for (int i = 0; i ——
length()返回的是最高true位索引+1,不是容量;且未覆盖所有可能置位位置(如高位 set 后中间有空洞) - 正确但低效:for (int i = 0; i ——
size()返回的是内部 long[] 数组容量(单位是 bit),不能直接用于遍历判断 - 推荐唯一做法:bitSet.cardinality()
注意边界与常见误区
cardinality() 行为稳定,但需留意几个易忽略点:
- 空 BitSet(未 set 任何位)返回 0
- 调用
clear()后再调用cardinality()返回 0,即使之前设过位 - BitSet 不限制索引上限,
set(1_000_000)合法,cardinality()仍能正确统计(内部自动扩容) - 不支持负索引,传入负数会抛
IndexOutOfBoundsException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











