BitSet
java.lang.Object
|—java.util.BitSet
public class BitSet
extends Object
implements Cloneable, Serializable
这个类实现了一个根据需要增长的位向量。 位集的每个组件都有一个布尔值。 BitSet 的位由非负整数索引。 可以检查、设置或清除各个索引位。 一个 BitSet 可用于通过逻辑 AND、逻辑异或和逻辑异或操作来修改另一个 BitSet 的内容。
默认情况下,集合中的所有位最初都具有值 false。
每个位集都有一个当前大小,即该位集当前使用的空间位数。 请注意,大小与位集的实现有关,因此它可能会随着实现而改变。 位集的长度与位集的逻辑长度相关,并且独立于实现来定义。
除非另有说明,否则将 null 参数传递给 BitSet 中的任何方法都将导致 NullPointerException。
如果没有外部同步,BitSet 对于多线程使用是不安全的。
构造函数摘要
构造函数 | 描述 |
---|---|
BitSet() | 创建一个新的位集。 |
BitSet(int nbits) | 创建一个位集,其初始大小足够大,可以显式表示索引范围为 0 到 nbits-1 的位。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
void | and(BitSet set) | 执行此目标位集与参数位集的逻辑与。 |
void | andNot(BitSet set) | 清除此 BitSet 中在指定 BitSet 中设置了相应位的所有位。 |
int | cardinality() | 返回此 BitSet 中设置为 true 的位数。 |
void | clear() | 将此 BitSet 中的所有位设置为 false。 |
void | clear(int bitIndex) | 将索引指定的位设置为 false。 |
void | clear(int fromIndex, int toIndex) | 将从指定的 fromIndex(包括)到指定的 toIndex(不包括)的位设置为 false。 |
Object | clone() | 克隆此 BitSet 会生成一个与其相同的新 BitSet。 |
boolean | equals(Object obj) | 将此对象与指定对象进行比较。 |
void | flip(int bitIndex) | 将指定索引处的位设置为其当前值的补码。 |
void | flip(int fromIndex, int toIndex) | 将从指定的 fromIndex(包括)到指定的 toIndex(不包括)的每个位设置为其当前值的补码。 |
boolean | get(int bitIndex) | 返回具有指定索引的位的值。 |
BitSet | get(int fromIndex, int toIndex) | 返回一个新的 BitSet,该 BitSet 由该 BitSet 中从 fromIndex(包括)到 toIndex(不包括)的位组成。 |
int | hashCode() | 返回此位集的哈希码值。 |
boolean | intersects(BitSet set) | 如果指定的 BitSet 有任何位设置为 true,并且在此 BitSet 中也设置为 true,则返回 true。 |
boolean | isEmpty() | 如果此 BitSet 不包含设置为 true 的位,则返回 true。 |
int | length() | 返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加一。 |
int | nextClearBit(int fromIndex) | 返回在指定起始索引上或之后发生的设置为 false 的第一位的索引。 |
int | nextSetBit(int fromIndex) | 返回在指定起始索引上或之后出现的第一个设置为 true 的索引。 |
void | or(BitSet set) | 使用位集参数执行此位集的逻辑或。 |
int | previousClearBit(int fromIndex) | 返回设置为 false 的最近位的索引,该位出现在指定的起始索引上或之前。 |
int | previousSetBit(int fromIndex) | 返回设置为 true 的最近位的索引,该位出现在指定的起始索引上或之前。 |
void | set(int bitIndex) | 将指定索引处的位设置为真。 |
void | set(int bitIndex, boolean value) | 将指定索引处的位设置为指定值。 |
void | set(int fromIndex, int toIndex) | 将指定 fromIndex(包括)到指定 toIndex(不包括)的位设置为 true。 |
void | set(int fromIndex, int toIndex, boolean value) | 将指定的 fromIndex(包括)到指定的 toIndex(不包括)的位设置为指定的值。 |
int | size() | 返回此 BitSet 实际使用的空间位数,以表示位值。 |
IntStream | stream() | 返回此 BitSet 包含处于设置状态的位的索引流。 |
byte[] | toByteArray() | 返回一个包含此位集中所有位的新字节数组。 |
long[] | toLongArray() | 返回一个新的长数组,其中包含此位集中的所有位。 |
String | toString() | 返回此位集的字符串表示形式。 |
static BitSet | valueOf(byte[] bytes) | 返回包含给定字节数组中所有位的新位集。 |
static BitSet | valueOf(long[] longs) | 返回一个包含给定长数组中所有位的新位集。 |
static BitSet | valueOf(ByteBuffer bb) | 返回一个新的位集,其中包含给定字节缓冲区中其位置和限制之间的所有位。 |
static BitSet | valueOf(LongBuffer lb) | 返回一个新的位集,其中包含给定长缓冲区中其位置和限制之间的所有位。 |
void | xor(BitSet set) | 使用位集参数执行此位集的逻辑异或。 |
从类 java.lang.Object 继承的方法 |
---|
finalize, getClass, notify, notifyAll, wait, wait, wait |
构造函数详细信息
BitSet
public BitSet()
创建一个新的位集。 所有位最初都是错误的。
BitSet
public BitSet(int nbits)
创建一个位集,其初始大小足够大,可以显式表示索引范围为 0 到 nbits-1 的位。 所有位最初都是错误的。
参数:
参数名称 | 参数描述 |
---|---|
nbits | 位集的初始大小 |
Throws:
Throw名称 | Throw描述 |
---|---|
NegativeArraySizeException | 如果指定的初始大小为负 |
方法详情
valueOf
public static BitSet valueOf(long[] longs)
返回一个包含给定长数组中所有位的新位集。
更准确地说,对于所有 n < 64 * longs.length,BitSet.valueOf(longs).get(n) == ((longs[n/64] & (1L<<(n%64))) != 0)。
此方法等效于 BitSet.valueOf(LongBuffer.wrap(longs))。
参数:
参数名称 | 参数描述 |
---|---|
longs | 一个长数组,包含一个位序列的小端表示,用作新位集的初始位 |
返回:
包含长数组中所有位的 BitSet
valueOf
public static BitSet valueOf(LongBuffer lb)
返回一个新的位集,其中包含给定长缓冲区中其位置和限制之间的所有位。
更准确地说,BitSet.valueOf(lb).get(n) == ((lb.get(lb.position()+n/64) & (1L<<(n%64))) != 0) n < 64 * lb.remaining()。
该方法不会修改长缓冲区,并且位集不会保留对缓冲区的引用。
参数:
参数名称 | 参数描述 |
---|---|
lb | 一个长缓冲区,包含其位置和限制之间的位序列的小端表示,用作新位集的初始位 |
返回:
包含指定范围内缓冲区中所有位的 BitSet
valueOf
public static BitSet valueOf(byte[] bytes)
返回包含给定字节数组中所有位的新位集。
更准确地说,对于所有 n < 8 * bytes.length,BitSet.valueOf(bytes).get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)。
此方法等效于 BitSet.valueOf(ByteBuffer.wrap(bytes))。
参数:
参数名称 | 参数描述 |
---|---|
bytes | 一个字节数组,包含一个位序列的小端表示,用作新位集的初始位 |
返回:
包含字节数组中所有位的 BitSet
valueOf
public static BitSet valueOf(ByteBuffer bb)
返回一个新的位集,其中包含给定字节缓冲区中其位置和限制之间的所有位。
更准确地说,BitSet.valueOf(bb).get(n) == ((bb.get(bb.position()+n/8) & (1<<(n%8))) != 0) n < 8 * bb.remaining()。
此方法不会修改字节缓冲区,并且位集不会保留对缓冲区的引用。
参数:
参数名称 | 参数描述 |
---|---|
bb | 一个字节缓冲区,包含其位置和限制之间的位序列的小端表示,用作新位集的初始位 |
返回:
包含指定范围内缓冲区中所有位的 BitSet
toByteArray
public byte[] toByteArray()
返回一个包含此位集中所有位的新字节数组。
更准确地说,如果 byte[] bytes = s.toByteArray(); 然后 bytes.length == (s.length()+7)/8 和 s.get(n) == ((bytes[n/8] & (1<<(n%8))) != 0) 对于所有 n < 8 * bytes.length。
返回:
包含此位集中所有位的小端表示的字节数组
toLongArray
public long[] toLongArray()
返回一个新的长数组,其中包含此位集中的所有位。
更准确地说,如果 long[] longs = s.toLongArray(); 然后 longs.length == (s.length()+63)/64 和 s.get(n) == ((longs[n/64] & (1L<<(n%64))) != 0) 对于所有 n < 64 * longs.length。
返回:
一个长数组,包含此位集中所有位的小端表示
flip
public void flip(int bitIndex)
将指定索引处的位设置为其当前值的补码。
参数:
参数名称 | 参数描述 |
---|---|
bitIndex | 要翻转的位的索引 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引为负 |
flip
public void flip(int fromIndex, int toIndex)
将从指定的 fromIndex(包括)到指定的 toIndex(不包括)的每个位设置为其当前值的补码。
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | 要翻转的第一位的索引 |
toIndex | 最后一位翻转后的索引 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果 fromIndex 为负数,或 toIndex 为负数,或 fromIndex 大于 toIndex |
set
public void set(int bitIndex)
将指定索引处的位设置为true。
参数:
参数名称 | 参数描述 |
---|---|
bitIndex | 位索引 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引为负 |
set
public void set(int bitIndex, boolean value)
将指定索引处的位设置为指定值。
参数:
参数名称 | 参数描述 |
---|---|
bitIndex | 位索引 |
value | 要设置的布尔值 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引为负 |
set
public void set(int fromIndex, int toIndex)
将指定 fromIndex(包括)到指定 toIndex(不包括)的位设置为 true。
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | 要设置的第一位的索引 |
toIndex | 要设置的最后一位之后的索引 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果 fromIndex 为负数,或 toIndex 为负数,或 fromIndex 大于 toIndex |
set
public void set(int fromIndex, int toIndex, boolean value)
将指定的 fromIndex(包括)到指定的 toIndex(不包括)的位设置为指定的值。
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | 要设置的第一位的索引 |
toIndex | 要设置的最后一位之后的索引 |
value | 将所选位设置为的值 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果 fromIndex 为负数,或 toIndex 为负数,或 fromIndex 大于 toIndex |
clear
public void clear(int bitIndex)
将索引指定的位设置为 false。
参数:
参数名称 | 参数描述 |
---|---|
bitIndex | 要清除的位的索引 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引为负 |
clear
public void clear(int fromIndex, int toIndex)
将从指定的 fromIndex(包括)到指定的 toIndex(不包括)的位设置为 false。
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | 要清除的第一位的索引 |
toIndex | 要清除的最后一位之后的索引 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果 fromIndex 为负数,或 toIndex 为负数,或 fromIndex 大于 toIndex |
clear
public void clear()
将此 BitSet 中的所有位设置为 false。
get
public boolean get(int bitIndex)
返回具有指定索引的位的值。 如果当前在此 BitSet 中设置了索引为 bitIndex 的位,则该值为 true; 否则,结果为false。
参数:
参数名称 | 参数描述 |
---|---|
bitIndex | 位索引 |
返回:
具有指定索引的位的值
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引为负 |
get
public BitSet get(int fromIndex, int toIndex)
返回一个新的 BitSet,该 BitSet 由该 BitSet 中从 fromIndex(包括)到 toIndex(不包括)的位组成。
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | 要包含的第一位的索引 |
toIndex | 要包含的最后一位之后的索引 |
返回:
此 BitSet 范围内的新 BitSet
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果 fromIndex 为负数,或 toIndex 为负数,或 fromIndex 大于 toIndex |
nextSetBit
public int nextSetBit(int fromIndex)
返回在指定起始索引上或之后出现的第一个设置为 true 的索引。 如果不存在这样的位,则返回 -1。
要遍历 BitSet 中的真实位,请使用以下循环:
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
// operate on index i here
if (i == Integer.MAX_VALUE) {
break; // or (i+1) would overflow
}
}
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | 开始检查的索引(包括) |
返回:
下一个设置位的索引,如果没有这样的位,则为 -1
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引为负 |
nextClearBit
public int nextClearBit(int fromIndex)
返回在指定起始索引上或之后发生的设置为 false 的第一位的索引。
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | 开始检查的索引(包括) |
返回:
下一个 clear 位的索引
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引为负 |
previousSetBit
public int previousSetBit(int fromIndex)
返回设置为 true 的最近位的索引,该位出现在指定的起始索引上或之前。 如果不存在这样的位,或者如果给出 -1 作为起始索引,则返回 -1。
要遍历 BitSet 中的真实位,请使用以下循环:
for (int i = bs.length(); (i = bs.previousSetBit(i-1)) >= 0; ) {
// operate on index i here
}
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | 开始检查的索引(包括) |
返回:
前一个设置位的索引,如果没有这样的位,则为 -1
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引小于 -1 |
previousClearBit
public int previousClearBit(int fromIndex)
返回设置为 false 的最近位的索引,该位出现在指定的起始索引上或之前。 如果不存在这样的位,或者如果给出 -1 作为起始索引,则返回 -1。
参数:
参数名称 | 参数描述 |
---|---|
fromIndex | the index to start checking from (inclusive) |
返回:
前一个清除位的索引,如果没有这样的位,则为 -1
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果指定的索引小于 -1 |
length
public int length()
返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加一。 如果 BitSet 不包含设置位,则返回零。
返回:
此 BitSet 的逻辑大小
isEmpty
public boolean isEmpty()
如果此 BitSet 不包含设置为 true 的位,则返回 true。
返回:
指示此 BitSet 是否为空的布尔值
intersects
public boolean intersects(BitSet set)
如果指定的 BitSet 有任何位设置为 true,并且在此 BitSet 中也设置为 true,则返回 true。
参数:
参数名称 | 参数描述 |
---|---|
set | 与之相交的位集 |
返回:
布尔值,指示此 BitSet 是否与指定的 BitSet 相交
cardinality
public int cardinality()
返回此 BitSet 中设置为 true 的位数。
返回:
此 BitSet 中设置为 true 的位数
and
public void and(BitSet set)
执行此目标位集与参数位集的逻辑与。 修改此位集,以便当且仅当它最初都具有值 true 并且位集参数中的相应位也具有值 true 时,其中的每个位都具有值 true。
参数:
参数名称 | 参数描述 |
---|---|
set | 位设置 |
or
public void or(BitSet set)
使用位集参数执行此位集的逻辑或。 修改此位集,以便当且仅当它已经具有值 true 或位集参数中的相应位具有值 true 时,其中的位具有值 true。
参数:
参数名称 | 参数描述 |
---|---|
set | 位设置 |
xor
public void xor(BitSet set)
使用位集参数执行此位集的逻辑异或。 此位集被修改,以便当且仅当以下语句之一成立时,其中的位具有值 true:
- 该位最初的值为真,而参数中的相应位的值为false。
- 该位最初的值为假,而参数中的相应位的值为true。
参数:
参数名称 | 参数描述 |
---|---|
set | 位设置 |
andNot
public void andNot(BitSet set)
清除此 BitSet 中在指定 BitSet 中设置了相应位的所有位。
参数:
参数名称 | 参数描述 |
---|---|
set | 用来屏蔽此 BitSet 的 BitSet |
hashCode
public int hashCode()
返回此位集的哈希码值。 哈希码仅取决于在此 BitSet 中设置了哪些位。
哈希码定义为以下计算的结果:
public int hashCode() {
long h = 1234;
long[] words = toLongArray();
for (int i = words.length; --i >= 0; )
h ^= words[i] * (i + 1);
return (int)((h >> 32) ^ h);
}
请注意,如果位集发生更改,哈希码也会更改。
覆盖:
类 Object 中的 hashCode
返回:
此位集的哈希码值
size
public int size()
返回此 BitSet 实际使用的空间位数,以表示位值。 集合中的最大元素是大小 – 第一个元素。
返回:
当前在此位集中的位数
equals
public boolean equals(Object obj)
将此对象与指定对象进行比较。 当且仅当参数不为 null 并且是具有与该位集完全相同的位集设置为 true 的 Bitset 对象时,结果才为 true。 也就是说,对于每个非负 int 索引 k,
((BitSet)obj).get(k) == this.get(k)
一定为true。 不比较两个位集的当前大小。
覆盖:
类 Object 中的等于
参数:
参数名称 | 参数描述 |
---|---|
obj | 比较的对象 |
返回:
如果对象相同,则为 true; 否则为false
clone
public Object clone()
克隆此 BitSet 会生成一个与其相同的新 BitSet。 位集的克隆是另一个位集,它具有与该位集完全相同的位设置为true。
覆盖:
在类 Object 中克隆
返回:
该位集的克隆
toString
public String toString()
返回此位集的字符串表示形式。 对于此 BitSet 包含处于设置状态的位的每个索引,该索引的十进制表示包含在结果中。 此类索引按从低到高的顺序列出,用“、”(逗号和空格)分隔并用大括号括起来,从而形成一组整数的常用数学符号。
例子:
BitSet drPepper = new BitSet();
现在 drPepper.toString() 返回“{}”。
drPepper.set(2);
现在 drPepper.toString() 返回“{2}”。
drPepper.set(4); drPepper.set(10);
现在 drPepper.toString() 返回“{2, 4, 10}”。
覆盖:
类 Object 中的 toString
返回:
此位集的字符串表示
stream
public IntStream stream()
返回此 BitSet 包含处于设置状态的位的索引流。 索引按从低到高的顺序返回。 流的大小是设置状态的位数,等于 cardinality() 方法返回的值。
在终端流操作执行期间,位设置必须保持不变。 否则,终端流操作的结果是不确定的。
返回:
表示集合索引的整数流