java.util.BitSet 详解

2020-08-18  本文已影响0人  许吉华

干嘛的?

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

如何实现的?


    /**
     * 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();
上一篇 下一篇

猜你喜欢

热点阅读