美文网首页
java.util.BitSet 详解

java.util.BitSet 详解

作者: 许吉华 | 来源:发表于2020-08-18 16:49 被阅读0次

干嘛的?

可以对海量数据进行一些统计工作,比如日志分析、用户数统计等。

如何实现的?

  • 前置知识:
    位、字节是计算机中的数据存储单位,一个字节由8位组成。位,是最基本的概念,由只有逻辑0和逻辑1的存在,因此很多东西、动作、数字都要表示为一串的字码例如: 1001 0000 1101等等。其中每一个逻辑0或者1便是一个位。

    /**
     * The internal field corresponding to the serialField "bits".
     */
    private long[] words;

BitSet 采用 long数组来标识位向量, 数组中的每个long元素可以标识连续的64个数字。
例如:
long[0] words可以标识0-63
long[1] words可以标识64-127
long在java中占用8个字节也就是64位,00000000***0000000。我们用每一位来表示一个数据是否出现过,0为没有出现过,1表示出现过。这样每64位就能标识连续的64个数(从0开始),例如标识1,3,4。对应二进制为 11010(十进制26) 2,4,5位上的数出现过。从零开始算分别为1,3,4。

  左移运算,让对应位变成1,逻辑与计算有一个为1就等于1
  (1l << 1) | (1l << 3) | (1l << 4) 

BitSet实现

 if (bitIndex < 0)
            throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);

        int wordIndex = wordIndex(bitIndex);
        expandTo(wordIndex);

        words[wordIndex] |= (1L << bitIndex); // Restores invariants

        checkInvariants();

相关文章

网友评论

      本文标题:java.util.BitSet 详解

      本文链接:https://www.haomeiwen.com/subject/knkkjktx.html