bitset.clear() 是清空整个位集最直接高效的方式,将所有已设置位重置为0,时间复杂度接近o(n/64),底层通过批量内存置零实现,不改变容量,调用后所有test(i)/get(i)均返回false。

BitSet.clear() 是清空整个位集最直接高效的方式,它将所有已设置的位重置为 0,时间复杂度接近 O(n/64),实际运行中常被视为常数级开销(尤其在容量固定或缓存友好场景下)。
clear() 与 clear(i) 的区别
注意区分两个常用方法:
- clear():无参版本,清空整个 BitSet 中所有位,无论当前是否被设置过
- clear(i):单参数版本,只清除指定索引 i 处的位(设为 0),不改变其他位状态
底层如何做到高效
以 Go 和 Java 的主流实现为例,clear() 并非逐位循环赋值,而是利用底层存储结构批量归零:
- Java BitSet 内部使用
long[] words,clear() 直接对每个 long 元素执行words[i] = 0 - Go bitset 使用
[]uint64,clear() 调用bytes.Clear或等效内存置零操作 - 两者都避免分支判断,充分利用 CPU 的向量化写入能力
使用时需注意的边界行为
不同语言实现对“已分配但未设置”的位处理一致,但对容量逻辑略有差异:
- Java 的
clear()不改变size()(即底层 long 数组长度),只影响逻辑内容 - Go bitset 的
ClearAll()会保留容量,Len()返回 0,Cap()不变 - 调用后再次
Test(i)或Get(i)对任意 i 均返回 false,无论 i 是否越界(越界访问通常安全返回 false)
替代方案对比
不推荐用循环调用 clear(i) 清空全部位:
- 显式循环(如 for i := 0; i
- 新建实例(
b = New(n))虽语义清晰,但涉及内存分配,GC 开销更高 -
clear()或ClearAll()是复用内存、零分配、语义明确的最佳选择










