Java BitSet 类

2024年11月1日 | 6 分钟阅读

Java 的 BitSet 类实现了一个位的向量。当需要更多位时,BitSet 会自动增长。BitSet 类属于 java.util 包。BitSet 类扩展了 Object 类,并提供了 Serializable 和 Cloneable 接口的实现。

位集合的每个组件至少包含一个布尔值。可以通过逻辑 AND、逻辑 OR 和逻辑 XOR 操作,由其他 BitSet 修改一个 BitSet 的内容。BitSet 类的位的索引由正整数表示。

位集合的每个元素包含 true 或 false 值。最初,集合中的所有位都为 false。如果未使用外部同步,BitSet 不适合多线程使用。

注意:将 null 参数传递给 BitSet 类的任何方法都会抛出 NullPointerException。

什么是 BitSet?

BitSet 是一个动态的位数组,其中每个位代表一个布尔值(true 或 false)。与布尔值数组或集合不同,BitSet 更节省内存,因为它将位表示为整数而不是单个布尔值。这使其在处理大量布尔值时特别有用。

创建 BitSet

要创建 BitSet,我们可以使用其构造函数

它创建一个默认大小为 64 位的新的 BitSet。

设置和清除位

我们可以使用 set(int index) 和 clear(int index) 方法来设置或清除 BitSet 中的特定位。index 参数表示位的索引。

获取位的数值

要获取特定位的数值,可以使用 get(int index) 方法

BitSet 的用例

1. 高效存储布尔值

当处理大量布尔标志时,BitSet 可以通过将它们表示为位来节省内存并提高性能。

2. 集合运算

BitSet 可用于对表示为位的集合执行集合运算,如并集、交集和差集。

3. 算法和数据结构

BitSet 是各种算法的基础数据结构,例如用于查找素数的埃拉托斯特尼筛法,以及在动态规划解决方案中用于涉及子集的问题。

实施

下面是一个完整的 Java 程序,演示了 BitSet 类的用法。该程序接受用户输入来对两个 BitSets 执行各种操作。

文件名: BitSetExample.java

输出

Enter the index of the bit you want to get (0-5): 4
Initial BitSet 1: {1, 2, 3}
Initial BitSet 2: {3, 4, 5}
Result of AND operation: {3}
Result of XOR operation: {1, 2, 4, 5}
Enter the index of the bit you want to get (0-5): 4
Value at index 4 in BitSet 2: true

在此程序中,我们首先创建两个 BitSets (bitSet1 和 bitSet2) 并设置一些初始位。然后,我们对这两个 BitSets 执行 AND 和 XOR 运算。最后,我们询问用户输入一个索引,并检索 bitSet2 中该位的数值。

Java BitSet 方法

序号修饰符 & 类型方法描述
1voidand(BitSet set)此方法用于对当前目标位集执行与指定参数的逻辑 AND 运算。
2voidandNot(BitSet set)此方法用于清除当前 BitSet 中所有与指定 BitSet 中设置为 true 的对应位相同的位。
3intcardinality()此方法返回此 BitSet 中设置为 true 的位数。
4voidclear()此方法将此 BitSet 中的所有位设置为 false。
5voidclear(int bitIndex)此方法将指定索引处的位设置为 false。
6voidclear(int fromIndex, int toIndex)此方法将指定 fromIndex(包含)到 toIndex(不包含)之间的位设置为 false。
7Objectclone()此方法创建此 BitSet 的一个副本,该副本与原 BitSet 相等。
8booleanequals(Object obj)此方法用于将当前对象与指定对象进行比较。
9voidflip(int bitIndex)此方法将指定索引处的位设置为其补码。
10voidflip(int fromIndex, int toIndex)此方法将指定 fromIndex(包含)到 toIndex(不包含)之间的每个位的值设置为其补码。
11booleanget(int bitIndex)此方法返回指定索引处的位值。
12BitSetget(int fromIndex, int toIndex)此方法返回一个由指定 fromIndex(包含)到 toIndex(不包含)之间的位组成的新的 BitSet。
13inthashCode()此方法返回此 BitSet 的哈希码值。
14booleanintersects(BitSet set)如果指定 BitSet 的设置为 true 的值在此 BitSet 的设置为 true 的值中也存在,则此方法返回 true。
15booleanisEmpty()如果当前 BitSet 不包含任何设置为 true 的位,则此方法返回 true。
16intlength()此方法返回此 BitSet 的“逻辑大小”。
17intnextClearBit(int fromIndex)此方法返回在指定索引处或之后第一个设置为 false 的位的索引。
18intnextSetBit(int fromIndex)此方法返回在指定索引处或之后第一个设置为 true 的位的索引。
19voidor(BitSet set)此方法用于对当前目标位集执行与指定参数的逻辑 OR 运算。
20intpreviousClearBit(int fromIndex)此方法返回在指定索引处或之前最近一个设置为 false 的位的索引。
21intpreviousSetBit(int fromIndex)此方法返回在指定索引处或之前最近一个设置为 true 的位的索引。
22voidset(int bitIndex)此方法将指定索引处的位设置为 true。
23voidset(int bitIndex, boolean value)此方法将指定 bitIndex 的位设置为指定的布尔值。
24voidset(int fromIndex, int toIndex)此方法将指定 fromIndex(包含)到 toIndex(不包含)之间的位设置为 true。
25voidset(int fromIndex, int toIndex, boolean value)此方法将指定 fromIndex(包含)到 toIndex(不包含)之间的位设置为指定的布尔值。
26intsize()此方法返回此 BitSet 用于表示位值实际占用的位数空间。
27IntStreamstream()此方法返回此 BitSet 中设置为 true 的索引流。
28byte[]toByteArray()此方法返回一个包含此位集所有位的字节数组。
29long[]toLongArray()此方法返回一个包含此位集所有位的长整型数组。
30StringtoString()此方法返回此位集的字符串表示形式。
31static BitSetvalueOf(byte[] bytes)此方法返回给定字节数组的一个新的位集。
32static BitSetvalueOf(long[] longs)此方法返回给定长整型数组的一个新的位集。
33static BitSetvalueOf(ByteBuffer bb)此方法从给定的字节缓冲区返回一个新的位集。
34static BitSetvalueOf(LongBuffer lb)此方法从给定的长整型缓冲区返回一个新的位集。
35voidxor(BitSet set)此方法用于对当前位集执行与指定位集参数的逻辑 XOR 运算。

结论

Java 的 BitSet 类提供了一个强大的工具,可以以空间高效的方式处理单个位。无论我们是处理大量的布尔值还是执行集合运算,BitSet 都可以显著提高代码的效率。通过理解和利用 BitSet 的功能,我们可以编写出更节省内存、性能更高的 Java 程序。