本文主要是介绍Java 中 BitSet 类的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Java 中 BitSet 类的用法
- API
- 构造
- 置位为 true
- 清除为 false
- 查找
- 位反转
- 长度
- 运算
- 流
- 其他
- 原理
- 底层数据结构
- 如何工作
API
构造
- 无参构造 :默认为 64 个 bit 的容量
BitSet bitset = new BitSet();
- 有参构造 :设置为 n 个 bit 的容量
BitSet bitset = new BitSet(1024);
- 静态工厂的 valueOf 构造 :支持从
byte[]
,long[]
,ByteBuffer
,LongBuffer
四种类型构造Bitset
BitSet.valueOf(bytes);BitSet.valueOf(longs);BitSet.valueOf(byteBuffer);BitSet.valueOf(longBuffer);
置位为 true
- 单独置位
bitset.set(4);//索引为4的位置的比特被置为1,返回void
- 批量置位
bitset.set(4,6);//索引在[4,6)范围内的位置的比特被置为1,返回void
清除为 false
- 单独清除
bitset.clear(4);//索引为4的位置的比特被置为0,返回void
- 批量清除
bitset.clear(4,6);//索引在[4,6)范围内的位置的比特被置为0,返回void
- 全部清除
bitset.clear();//所有位置都被清空为0,返回void
查找
- 查询某一位是否已被置位
bitset.get(4);//返回boolean,为true表示该位被置位
- 获取某区间的 BitSet
bitset.get(4,6);//返回另一个 BitSet,内容取 bitset的[4,6)之间的元素
注:获取的区间后,索引的编号会改变,比如这里新的 BitSet 的 0 号索引对应的是原来 BitSet 的 4 号索引
位反转
bitset.flip(4);bitset.flip(4,6);
长度
有三个和长度相关的 API,分别是 size、cardinal、length
- size:返回该 BitSet 的最大容量
- cardinal:返回该 BitSet 中 1 的个数
- length:返回最后一个1之前的所有元素的个数,如果一个1也没有就返回0
运算
- 判断是否有交集
first.intersects(second);//返回boolean,如果有交集元素则为true
- 求交集
first.and(second);//返回一个 BitSet
- 求并集
first.or(second);//返回一个 BitSet
- 求异或集
first.xor(second);//返回一个 BitSet
流
bitSet.stream();//返回一个 Stream 流
其他
下面四个方法顾名思义:
int idx = bitset.nextSetBit(fromIndex);int idx = bitset.previousSetBit(fromIndex); int idx = bitset.nextClearBit(fromIndex);int idx = bitset.previousClearBit(fromIndex);
原理
底层数据结构
BitSet 的底层数据结构是 long[] 数组
如何工作
置位时,把1左移对应的位数,再与 long[] 中特定的 long 元素做或运算
查询时,把1左移对应的位数,再与 long[] 中特定的 long 元素做与运算,运算结果大于0说明该位为true
这篇关于Java 中 BitSet 类的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!