java中的BitSet使用实战实例
作者:有梦想的攻城狮
Java中的BitSet类是一个高效处理位操作的工具类,用于表示可动态扩展的位向量(bit vector),本文给大家介绍java中的BitSet使用实战实例,感兴趣的朋友一起看看吧
Java中的BitSet
类是一个高效处理位操作的工具类,用于表示可动态扩展的位向量(bit vector)。以下是详细解析:
一、核心特性
- 动态扩容:初始容量可指定,超出时自动扩展
- 空间效率:每个位仅占1 bit(传统boolean数组占1 byte)
- 线程不安全:非同步实现,多线程需自行同步
二、基础用法
1. 创建实例
BitSet bits1 = new BitSet(); // 默认初始容量(64位) BitSet bits2 = new BitSet(100); // 初始至少容纳100位
2. 基本操作
BitSet bits = new BitSet(); // 设置位 bits.set(3); // 第3位设为true(索引从0开始) bits.set(5, true); // 显式设置true bits.set(10, 20); // 设置区间[10,20)为true // 清除位 bits.clear(3); // 清除第3位 bits.clear(5, 15); // 清除区间[5,15) // 获取状态 boolean b = bits.get(3); // 返回false(已被清除) // 翻转位 bits.flip(2); // 第2位取反 bits.flip(0, 10); // 翻转区间[0,10)
三、高级功能
1. 位运算
BitSet a = new BitSet(); a.set(0, 3); // 0,1,2位为true BitSet b = new BitSet(); b.set(2, 5); // 2,3,4位为true a.and(b); // 与操作:结果仅2位为true a.or(b); // 或操作:0-4位为true a.xor(b); // 异或操作:0,1,3,4位为true a.andNot(b); // 差集操作:0,1位为true
2. 实用方法
int cardinality = bits.cardinality(); // 统计true位的数量 int length = bits.length(); // 最高设置位索引+1 int size = bits.size(); // 实际使用空间(bits) byte[] bytes = bits.toByteArray(); // 转为字节数组 long[] longs = bits.toLongArray(); // 转为长整型数组 BitSet newBits = (BitSet) bits.clone(); // 深拷贝
四、典型应用场景
- 海量数据标记:存储千万级数据的开关状态
- 集合运算:快速实现交集/并集/差集操作
- 布隆过滤器:作为底层位数组实现
- 权限系统:用位掩码表示权限组合
- 算法优化:如八皇后问题、数独求解等
五、性能对比
数据结构 | 内存占用(1000元素) | 访问速度 |
---|---|---|
boolean[] | ~1000 bytes | O(1) |
BitSet | ~125 bytes | O(1) |
EnumSet | ~20 bytes | O(1) |
六、注意事项
- 索引越界:访问未设置的位返回false,不会报错
- 扩容机制:容量不足时自动翻倍扩展(如64→128→256…)
- 序列化:直接序列化可能因JDK版本产生兼容问题
- 替代方案:对线程安全要求高时可用
ConcurrentBitSet
七、实战示例
// 查找重复元素 BitSet seen = new BitSet(); int[] arr = {3, 1, 4, 1, 5, 9, 2, 6}; for (int num : arr) { if (seen.get(num)) { System.out.println("重复值: " + num); } seen.set(num); } // 输出:重复值: 1
通过合理使用BitSet
,可以在空间效率和操作性能之间取得良好平衡。建议根据具体场景评估是否适合使用位操作方案。
到此这篇关于java中的BitSet使用详解的文章就介绍到这了,更多相关java bitset使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!