bitset.length() 返回已设置为true的最高位索引加1,即逻辑长度;它不反映底层存储容量,空位集时返回0,与统计true个数的cardinality()用途不同。

BitSet.length() 返回的是位集的逻辑长度,即当前已设置为 true 的最高位索引加 1。
逻辑长度不是存储容量
它和底层分配的内存空间(如内部 long 数组长度 × 64)无关。例如:
- 调用
bitset.set(100)后,length()返回101; - 即使内部实际用了 2 个 long(128 位),逻辑长度仍是 101;
- 若只设了第 0 位和第 63 位,
length()是64,不是 128。
空位集与边界情况
当 BitSet 中没有任何位被设为 true 时:
-
length()返回0; -
get(i)对任意i >= 0都返回false,但不会因越界报错; - 注意:
get(-1)会因自动转为大正整数而访问非法位置,应避免。
和 cardinality() 的区别
length() 关注“最远影响范围”,cardinality() 统计“有多少个 true”:
-
bitset.set(5); bitset.set(99);→length() == 100,cardinality() == 2; - 两者数值通常不等,用途完全不同。
为什么叫“逻辑”长度
因为它是从使用视角定义的有效数据跨度:
- 序列化时只需覆盖前
length()位; - 遍历时常以
length()为上界(但更推荐用nextSetBit(0)迭代); - 它反映的是“这个位集当前表达的数据最大下标是多少”,而非物理实现细节。










