Module java.base
Package java.util

Class BitSet

java.lang.Object
java.util.BitSet
所有已实现的接口:
Serializable, Cloneable

public class BitSet extends Object implements Cloneable, Serializable
该类实现了根据需要增长的位向量。位集的每个组件都有一个boolean值。位集的位由非负整数索引。可以检查、设置或清除位集中的单个索引位。一个BitSet可以通过逻辑AND、逻辑包含OR和逻辑排他OR操作来修改另一个BitSet的内容。

默认情况下,集合中的所有位最初都具有值false

每个位集都有一个当前大小,即当前位集使用的位空间数量。请注意,大小与位集的实现相关,因此它可能随着实现而改变。位集的长度与位集的逻辑长度相关,并且独立于实现而定义。

除非另有说明,否则将空参数传递给BitSet中的任何方法将导致NullPointerException

BitSet在没有外部同步的情况下不适用于多线程使用。

自从:
1.0
参见:
  • Constructor Summary

    Constructors
    Constructor
    Description
    BitSet()
    创建一个新的位集。
    BitSet(int nbits)
    创建一个位集,其初始大小足够大,可以明确表示索引范围内的位,从0nbits-1
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    and(BitSet set)
    对该目标位集与参数位集执行逻辑AND操作。
    void
    andNot(BitSet set)
    清除在指定BitSet中相应位设置的所有位。
    int
    返回在此BitSet中设置为true的位数。
    void
    clear()
    将此BitSet中的所有位设置为false
    void
    clear(int bitIndex)
    将由索引指定的位设置为false
    void
    clear(int fromIndex, int toIndex)
    将从指定的fromIndex(包括)到指定的toIndex(不包括)的位设置为false
    clone()
    克隆此BitSet会产生一个等于它的新BitSet
    boolean
    equals(Object obj)
    将此对象与指定对象进行比较。
    void
    flip(int bitIndex)
    将指定索引处的位设置为其当前值的补码。
    void
    flip(int fromIndex, int toIndex)
    将从指定的fromIndex(包括)到指定的toIndex(不包括)的每个位设置为其当前值的补码。
    boolean
    get(int bitIndex)
    返回指定索引处的位的值。
    get(int fromIndex, int toIndex)
    返回由此BitSet中的位从fromIndex(包括)到toIndex(不包括)组成的新BitSet
    int
    返回此位集的哈希码值。
    boolean
    如果指定的BitSet中有任何位设置为true,并且这些位在此BitSet中也设置为true,则返回true
    boolean
    如果此BitSet不包含设置为true的位,则返回true
    int
    length()
    返回此BitSet的“逻辑大小”:位集中最高设置位的索引加一。
    int
    nextClearBit(int fromIndex)
    返回指定起始索引之后设置为false的第一个位的索引。
    int
    nextSetBit(int fromIndex)
    返回指定起始索引之后设置为true的第一个位的索引。
    void
    or(BitSet set)
    对此位集与位集参数执行逻辑OR操作。
    int
    previousClearBit(int fromIndex)
    返回指定起始索引之前设置为false的最近位的索引。
    int
    previousSetBit(int fromIndex)
    返回指定起始索引之前设置为true的最近位的索引。
    void
    set(int bitIndex)
    将指定索引处的位设置为true
    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中使用的位空间数量。
    stream()
    返回此BitSet中包含处于设置状态的位的索引流。
    byte[]
    返回一个包含此位集中所有位的新字节数组。
    long[]
    返回一个包含此位集中所有位的新长整型数组。
    返回此位集的字符串表示形式。
    static BitSet
    valueOf(byte[] bytes)
    返回一个包含给定字节数组中所有位的新位集。
    static BitSet
    valueOf(long[] longs)
    返回一个包含给定长整型数组中所有位的新位集。
    static BitSet
    返回一个包含给定字节缓冲区中位的新位集,介于其位置和限制之间。
    static BitSet
    返回一个包含给定长整型缓冲区中位的新位集,介于其位置和限制之间。
    void
    xor(BitSet set)
    对此位集与位集参数执行逻辑XOR操作。

    Methods declared in class java.lang.Object

    finalize, getClass, notify, notifyAll, wait, wait, wait
  • Constructor Details

    • BitSet

      public BitSet()
      创建一个新的位集。所有位最初都是false
    • BitSet

      public BitSet(int nbits)
      创建一个位集,其初始大小足够大,可以明确表示索引范围内的位,从0nbits-1。所有位最初都是false
      参数:
      nbits - 位集的初始大小
      抛出:
      NegativeArraySizeException - 如果指定的初始大小为负数
  • Method Details

    • valueOf

      public static BitSet valueOf(long[] longs)
      返回一个包含给定长整型数组中所有位的新位集。

      更准确地说,
      BitSet.valueOf(longs).get(n) == ((longs[n/64] & (1L<<(n%64))) != 0)
      对于所有n < 64 * longs.length

      此方法等效于BitSet.valueOf(LongBuffer.wrap(longs))

      参数:
      longs - 包含要用作新位集的初始位的位序列的小端表示的长整型数组
      返回:
      包含长整型数组中所有位的BitSet
      自从:
      1.7
    • 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
      自从:
      1.7
    • valueOf

      public static BitSet valueOf(byte[] bytes)
      返回一个包含给定字节数组中所有位的新位集。

      更准确地说,
      BitSet.valueOf(bytes).get(n) == ((bytes[n/8] & (1<<(n%8))) != 0)
      对于所有n < 8 * bytes.length

      此方法等效于BitSet.valueOf(ByteBuffer.wrap(bytes))

      参数:
      bytes - 包含要用作新位集的初始位的位序列的小端表示的字节数组
      返回:
      包含字节数组中所有位的BitSet
      自从:
      1.7
    • 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
      自从:
      1.7
    • 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

      返回:
      包含此位集中所有位的小端表示的字节数组
      自从:
      1.7
    • 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

      返回:
      包含此位集中所有位的小端表示的长整型数组
      自从:
      1.7
    • flip

      public void flip(int bitIndex)
      将指定索引处的位设置为其当前值的补码。
      参数:
      bitIndex - 要翻转的位的索引
      抛出:
      IndexOutOfBoundsException - 如果指定的索引为负数
      自从:
      1.4
    • flip

      public void flip(int fromIndex, int toIndex)
      将从指定的fromIndex(包括)到指定的toIndex(不包括)的每个位设置为其当前值的补码。
      参数:
      fromIndex - 要翻转的第一个位的索引
      toIndex - 要翻转的最后一位的索引之后
      抛出:
      IndexOutOfBoundsException - 如果fromIndex为负数,或toIndex为负数,或fromIndex大于toIndex
      自版本:
      1.4
    • set

      public void set(int bitIndex)
      将指定索引处的位设置为true
      参数:
      bitIndex - 位索引
      抛出:
      IndexOutOfBoundsException - 如果指定的索引为负数
      自版本:
      1.0
    • set

      public void set(int bitIndex, boolean value)
      将指定索引处的位设置为指定的值。
      参数:
      bitIndex - 位索引
      value - 要设置的布尔值
      抛出:
      IndexOutOfBoundsException - 如果指定的索引为负数
      自版本:
      1.4
    • set

      public void set(int fromIndex, int toIndex)
      将从指定的fromIndex(包括)到指定的toIndex(不包括)的位设置为true
      参数:
      fromIndex - 要设置的第一个位的索引
      toIndex - 要设置的最后一位的索引之后
      抛出:
      IndexOutOfBoundsException - 如果fromIndex为负数,或toIndex为负数,或fromIndex大于toIndex
      自版本:
      1.4
    • set

      public void set(int fromIndex, int toIndex, boolean value)
      将从指定的fromIndex(包括)到指定的toIndex(不包括)的位设置为指定的值。
      参数:
      fromIndex - 要设置的第一个位的索引
      toIndex - 要设置的最后一位的索引之后
      value - 要将选定位设置为的值
      抛出:
      IndexOutOfBoundsException - 如果fromIndex为负数,或toIndex为负数,或fromIndex大于toIndex
      自版本:
      1.4
    • clear

      public void clear(int bitIndex)
      将由索引指定的位设置为false
      参数:
      bitIndex - 要清除的位的索引
      抛出:
      IndexOutOfBoundsException - 如果指定的索引为负数
      自版本:
      1.0
    • clear

      public void clear(int fromIndex, int toIndex)
      将从指定的fromIndex(包括)到指定的toIndex(不包括)的位设置为false
      参数:
      fromIndex - 要清除的第一个位的索引
      toIndex - 要清除的最后一位的索引之后
      抛出:
      IndexOutOfBoundsException - 如果fromIndex为负数,或toIndex为负数,或fromIndex大于toIndex
      自版本:
      1.4
    • clear

      public void clear()
      将此BitSet中的所有位设置为false
      自版本:
      1.4
    • get

      public boolean get(int bitIndex)
      返回具有指定索引的位的值。如果在此BitSet中索引为bitIndex的位当前设置为true,则值为true;否则,结果为false
      参数:
      bitIndex - 位索引
      返回:
      具有指定索引的位的值
      抛出:
      IndexOutOfBoundsException - 如果指定的索引为负数
    • get

      public BitSet get(int fromIndex, int toIndex)
      返回由此BitSet中从fromIndex(包括)到toIndex(不包括)的位组成的新BitSet
      参数:
      fromIndex - 要包括的第一个位的索引
      toIndex - 要包括的最后一位的索引之后
      返回:
      从此BitSet范围内的新BitSet
      抛出:
      IndexOutOfBoundsException - 如果fromIndex为负数,或toIndex为负数,或fromIndex大于toIndex
      自版本:
      1.4
    • nextSetBit

      public int nextSetBit(int fromIndex)
      返回在指定起始索引之后出现的第一个设置为true的位的索引。如果不存在这样的位,则返回-1

      要遍历BitSet中的true位,请使用以下循环:

       
       for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
           // 在此处操作索引 i
           if (i == Integer.MAX_VALUE) {
               break; // 或者 (i+1) 会溢出
           }
       }
      参数:
      fromIndex - 要开始检查的索引(包括)
      返回:
      下一个设置位的索引,如果没有这样的位,则返回-1
      抛出:
      IndexOutOfBoundsException - 如果指定的索引为负数
      自版本:
      1.4
    • nextClearBit

      public int nextClearBit(int fromIndex)
      返回在指定起始索引之后出现的第一个设置为false的位的索引。
      参数:
      fromIndex - 要开始检查的索引(包括)
      返回:
      下一个清除位的索引
      抛出:
      IndexOutOfBoundsException - 如果指定的索引为负数
      自版本:
      1.4
    • previousSetBit

      public int previousSetBit(int fromIndex)
      返回在指定起始索引之前出现的最近设置为true的位的索引。如果不存在这样的位,或者如果将-1作为起始索引,则返回-1

      要遍历BitSet中的true位,请使用以下循环:

       
       for (int i = bs.length(); (i = bs.previousSetBit(i-1)) >= 0; ) {
           // 在此处操作索引 i
       }
      参数:
      fromIndex - 要开始检查的索引(包括)
      返回:
      上一个设置位的索引,如果没有这样的位,则返回-1
      抛出:
      IndexOutOfBoundsException - 如果指定的索引小于-1
      自版本:
      1.7
    • previousClearBit

      public int previousClearBit(int fromIndex)
      返回在指定起始索引之前出现的最近设置为false的位的索引。如果不存在这样的位,或者如果将-1作为起始索引,则返回-1
      参数:
      fromIndex - 要开始检查的索引(包括)
      返回:
      上一个清除位的索引,如果没有这样的位,则返回-1
      抛出:
      IndexOutOfBoundsException - 如果指定的索引小于-1
      自版本:
      1.7
    • length

      public int length()
      返回此BitSet的“逻辑大小”:BitSet中最高设置位的索引加一。如果BitSet不包含设置位,则返回零。
      返回:
      BitSet的逻辑大小
      自版本:
      1.2
    • isEmpty

      public boolean isEmpty()
      如果此BitSet不包含设置为true的位,则返回true
      返回:
      指示此BitSet是否为空的布尔值
      自版本:
      1.4
    • intersects

      public boolean intersects(BitSet set)
      如果指定的BitSet中有任何位设置为true,并且在此BitSet中也设置为true,则返回true
      参数:
      set - 要与之求交集的BitSet
      返回:
      指示此BitSet是否与指定的BitSet相交的布尔值
      自版本:
      1.4
    • cardinality

      public int cardinality()
      返回此BitSet中设置为true的位数。
      返回:
      BitSet中设置为true的位数
      自版本:
      1.4
    • and

      public void and(BitSet set)
      对此目标位集执行与参数位集的逻辑AND操作。修改此位集,使得其中的每个位的值仅当它最初的值为true且参数位集中的相应位也为true时才为true
      参数:
      set - 一个位集
    • or

      public void or(BitSet set)
      对此位集执行与参数位集的逻辑OR操作。修改此位集,使得其中的位仅当它已经为true或参数位集中的相应位为true时才为true
      参数:
      set - 一个位集
    • xor

      public void xor(BitSet set)
      对此位集执行与参数位集的逻辑XOR操作。修改此位集,使得其中的位仅当以下语句之一成立时才为true
      • 该位最初为true,并且参数中的相应位为false
      • 该位最初为false,并且参数中的相应位为true
      参数:
      set - 一个位集
    • andNot

      public void andNot(BitSet set)
      清除此BitSet中对应位在指定BitSet中设置的所有位。
      参数:
      set - 用于屏蔽此BitSetBitSet
      自 JDK 版本:
      1.2
    • 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);
       }
      注意,如果位集发生更改,则哈希码会更改。
      覆盖:
      hashCode 在类 Object
      返回:
      此位集的哈希码值
      另请参阅:
    • size

      public int size()
      返回实际用于表示位值的位集中使用的位数。集合中的最大元素是大小 - 1 的元素。
      返回:
      当前位集中的位数
    • equals

      public boolean equals(Object obj)
      将此对象与指定对象进行比较。结果为true当且仅当参数不为null且为具有与此位集完全相同的位设置为trueBitSet对象。也就是说,对于每个非负的int索引k
      ((BitSet)obj).get(k) == this.get(k)
      必须为真。不比较两个位集的当前大小。
      覆盖:
      equals 在类 Object
      参数:
      obj - 要比较的对象
      返回:
      如果对象相同则为true; 否则为false
      另请参阅:
    • clone

      public Object clone()
      克隆此BitSet会产生一个等于它的新BitSet。位集的克隆是另一个位集,其具有与此位集完全相同的位设置为true
      覆盖:
      clone 在类 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}"。
      覆盖:
      toString 在类 Object
      返回:
      此位集的字符串表示形式
    • stream

      public IntStream stream()
      返回此BitSet中包含处于设置状态的位的索引流。索引按从最低到最高的顺序返回。流的大小是处于设置状态的位数,等于cardinality()方法返回的值。

      当终端流操作开始时(具体来说,流的分割器是延迟绑定),流绑定到此位集。如果在该操作期间修改了位集,则结果是未定义的。

      返回:
      代表设置索引的整数流
      自 JDK 版本:
      1.8