如何在 Java 中利用 BitSet.andNot() 实现集合间的差集运算逻辑

小敏吖_4696

小敏吖_4696

2026-05-01

688人浏览

原创

bitset.andnot() 是位级清除操作,将调用方中参数 bitset 为 true 的位设为 false,适用于元素为非负整数且范围可控的差集场景;需先复制原 bitset、转换 setb 为 bitset 并跳过负数,再执行 andnot()。

如何在 java 中利用 bitset.andnot() 实现集合间的差集运算逻辑

BitSet.andNot() 的作用和适用场景

BitSet.andNot() 并不是“求差集”的通用集合操作,而是位运算层面的清除操作:它会把调用方 BitSet 中所有在参数 BitSet 里为 true 的位,全部置为 false。这恰好对应数学上 A − B(即 A 中有、B 中没有的元素)的语义——但前提是你的“元素”是连续非负整数,且你用索引代表元素值。

这种用法常见于:

  • 布尔标记数组压缩(如筛素数、标记已访问 ID)
  • 内存敏感场景下替代 HashSet<integer></integer>
  • 元素范围可控(比如 ID 在 0~1000000 内),且稀疏度不高

为什么不能直接传入任意集合?

BitSet.andNot() 只接受另一个 BitSet 对象,不支持 List、Set 或数组。如果你手头是 Set<integer></integer>,必须先转成 BitSet,否则会编译报错:

error: incompatible types: Set<integer> cannot be converted to BitSet</integer>

转换时还要注意:

Java Maven Common
Java Maven Common

Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

下载
  • 负数会被忽略(BitSet.set(int) 对负索引抛 IndexOutOfBoundsException)
  • 非整数类型(如 String、自定义对象)无法映射,必须预定义 ID 映射规则
  • 空指针风险:传入 null 会触发 NullPointerException

正确构造差集的三步实操

要计算 setA − setB(即 A 中有、B 中没有的元素),按顺序做:

  • 创建副本:用 new BitSet(setA) 初始化结果,避免污染原 setA
  • 转换 setB:遍历 setB 中每个 int 值 i,调用 bitSetB.set(i);跳过 i 的项
  • 执行差集:调用 result.andNot(bitSetB)

示例片段:

BitSet setA = new BitSet(); setA.set(1); setA.set(3); setA.set(5);
Set<integer> setB = 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}
</integer>

容易被忽略的边界与性能点
  • BitSet.andNot() 是就地修改,不返回新实例;若需保留原 BitSet,必须手动复制
  • 大量稀疏高位(如只设了第 1000000 位)会导致内部数组膨胀,内存占用远超等效 HashSet
  • 并发不安全:多个线程同时调用 andNot() 会破坏数据,需外层同步或改用 ConcurrentHashMap + 分段逻辑
  • 如果只是临时算一次差集,且元素量小(stream().filter(...).collect() 可读性更高,别硬套 BitSet

实际项目中,看到有人把数据库主键列表塞进 BitSet 做差集,结果遇到主键为 UUID 或负数 ID 直接失败——这时候该回归泛型集合,而不是强行位运算。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10697

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7822

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6812

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1164

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

948

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1396

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2809

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20111

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1235

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习