发布于2026-07-09 阅读(0)
扫一扫,手机访问
BitSet.andNot() 并不是大家第一反应里那个“求差集”的通用集合操作,它实际上是位运算层面的清除操作:会把调用方 BitSet 中所有在参数 BitSet 里为 true 的位,全部置为 false。这恰好对应数学上 A − B(即 A 中有、B 中没有的元素)的语义——但别忘了,前提是你的“元素”得是连续非负整数,并且你用索引来代表元素值。

这种用法在哪些场合比较常见?想一想:
HashSet说白了,它是一款精致的小工具,但在错误的情境里就会变成一把伤手的扳手。
这里有个容易踩的坑:BitSet.andNot() 只接受另一个 BitSet 对象,不支持 List、Set 或数组。如果你手头拿的是 Set,必须先转成 BitSet,否则编译器会毫不留情地报错:
error: incompatible types: Setcannot be converted to BitSet
转换时还得留神几个细节:
BitSet.set(int) 遇到负索引会抛 IndexOutOfBoundsExceptionnull 会触发 NullPointerException要计算 setA − setB(即 A 中有、B 中没有的元素),按下面的顺序来:
new BitSet(setA) 初始化结果,避免污染原 setAsetB 中每个 int 值 i,调用 bitSetB.set(i);跳过 i < 0 的项result.andNot(bitSetB)直接看一段代码更直观:
BitSet setA = new BitSet(); setA.set(1); setA.set(3); setA.set(5); SetsetB = Set.of(3, 4, 6); BitSet bitSetB = new BitSet(); for (int i : setB) { if (i >= 0) bitSetB.set(i); } BitSet diff = new BitSet(setA); diff.andNot(bitSetB); // diff 现在含 {1, 5}
BitSet.andNot() 是就地修改,不返回新实例;若想保留原 BitSet,必须手动复制HashSetandNot() 会破坏数据,需要外层同步,或者改用 ConcurrentHashMap 加分段逻辑stream().filter(...).collect() 可读性更高,别硬套 BitSet ——杀鸡莫用牛刀实际项目中,曾见过有人把数据库主键列表塞进 BitSet 做差集,结果遇到主键为 UUID 或负数 ID,直接失败。这时候就该回归泛型集合,而不是强行用位运算绕路走。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8