BitSet.intersects()用于高效判断两个BitSet是否存在共同置位的位,不修改原数据、不构造新对象,仅返回布尔值;需实例调用、参数非null,适用于资源占用检查、权限校验等快速前置判断场景。

BitSet.intersects() 就是专为这个目的设计的:它能在不计算具体交集内容的前提下,用最低开销判断两个 BitSet 是否存在至少一个共同为 true 的位。
核心逻辑很直接
只要两个 BitSet 在同一个索引位置上都为 true,就立即返回 true;遍历完所有可能重叠的位都没找到,就返回 false。
- 不修改任何一个 BitSet,原数据完全保留
- 不构造新 BitSet,也不做按位与运算,纯检查逻辑
- 底层基于 long 数组逐字进行或运算预判,实际执行非常快
调用时必须注意三点
写错调用方式会导致编译失败或运行异常:
- 必须通过实例调用,比如 bs1.intersects(bs2) ✅,不能写成 BitSet.intersects(bs2) ❌(非静态方法)
- 参数不能为 null,否则抛出 NullPointerException
- 两个 BitSet 都可以动态扩容,无需预先对齐长度;intersects 自动处理不同大小的比较范围
和 and() 方法别混用
如果你只关心“有没有重叠”,就用 intersects();如果需要知道“哪些位重叠了”,就得换别的方案:
立即学习“Java免费学习笔记(深入)”;
- intersects():回答“有没有?”——布尔值,快、轻量、无副作用
- and():会把结果写回调用者自身(如 bs1.and(bs2) 后 bs1 变成交集),改变原对象
- 若需交集内容又不想改原对象,可先 bs1.clone().and(bs2)
典型适用场景
适合那些只需快速否决或放行的前置判断:
- 资源分配前检查 ID 是否已被占用(每个 bit 对应一个资源编号)
- 权限校验中判断用户角色权限集合与请求权限是否有交集
- 布隆过滤器辅助结构中做第一轮碰撞快速筛查
- 去重系统里判断某批整数是否与已存集合存在重复项


















