BitSet.set(int fromIndex, int toIndex) 将左闭右开区间[fromIndex, toIndex)内所有位设为true,自动扩容,fromIndex>toIndex或负索引抛异常。
BitSet.set(int fromIndex, int toIndex)
是 Java 中高效批量设置位区间状态的核心方法,适用于需要对大范围二进制标志(如权限控制、任务标记、布隆过滤器预热等)进行原子性“开启”操作的场景。它将
区间内所有位设为
(注意:右边界
不包含),时间复杂度接近 O(1) 到 O(n/w),其中 w 是机器字长(通常 64),远优于循环调用
。
理解索引语义与边界行为
该方法采用**左闭右开区间**:
-
实际影响索引 2、3、4(共 3 个位),不修改索引 5;
- 若
,不执行任何操作(合法且无副作用);
- 若
,抛出
;
- 若任一索引为负数,同样抛出异常;
- 若
,BitSet 会自动扩容(内部数组扩展),无需手动处理容量。
安全批量启用指定范围
典型使用需确保参数合法,并利用其自动扩容特性:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
显式校验参数(尤其当索引来自用户输入或计算结果时):
int from = Math.max(0, start);int to = Math.max(from, end); // 防止 from > toif (from
配合
或
判断当前有效位范围(
返回最高
位索引+1,
返回内部 long 数组容量);
若需“从某位置开始设到末尾”,可先估算上限(如
),BitSet 会按需分配,但应避免无意义的大值以防内存浪费。
结合 clear() 实现“置为指定值”的模拟
BitSet 本身没有直接的
,但可通过组合实现任意布尔值批量赋值:
设为
:直接调用
;
设为
:调用
(同样左闭右开);
若需“翻转”区间:用
;
注意:
和
同样支持区间,行为一致,是 set 的自然互补操作。
性能提示与常见误区
不要在循环中反复调用
替代区间操作——单次
比 N 次单点 set 快数倍至数十倍;
BitSet 不是线程安全的,多线程写入需外部同步(如用
块包裹 set 调用);
该方法不会重置已超出当前
的高位为 false,只确保 [from, to) 内为 true,其余位状态不变;
若需“仅保留某区间为 true,其余全 false”,应先
全局再
,或用
配合掩码 BitSet。
[fromIndex, toIndex)truetoIndexset(i)bitSet.set(2, 5)fromIndex == toIndexfromIndex > toIndexIllegalArgumentExceptiontoIndex > bitSet.size()length()size()length()truesize()bitSet.set(from, Integer.MAX_VALUE)set(from, to, value)trueset(from, to)falseclear(from, to)flip(from, to)clear()flip()set(i)set(from, to)synchronizedlength()clear()set(from, to)and()