干嘛的?
可以对海量数据进行一些统计工作,比如日志分析、用户数统计等。
如何实现的?
- 前置知识:
位、字节是计算机中的数据存储单位,一个字节由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();
网友评论