小G今天看下布隆过滤器(有误差),主要判断集合是否存在,其实布隆里面有一个知识点,就是BitSet
我今天先说明下bitSet后续有时间我在写下布隆过滤器
首先看下java.util.BitSet
- set方法
public void set(int bitIndex) {
if (bitIndex < 0)
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
// 进去可以看到bitIndex >> ADDRESS_BITS_PER_WORD; 右移动6,也就是2^6次方,64个数组
int wordIndex = wordIndex(bitIndex);
//在下面有详细说明
expandTo(wordIndex);
//在下面有详细说明
words[wordIndex] |= (1L << bitIndex); // Restores invariants
//这个就是一个检测数据
checkInvariants();
}
expandTo(wordIndex)解释看下面
private void expandTo(int wordIndex) {
int wordsRequired = wordIndex+1;
//放的数据, 比较下数组的下座标是否已经超出
if (wordsInUse < wordsRequired) {
//copy数组,超过后新增2倍
ensureCapacity(wordsRequired);
wordsInUse = wordsRequired;
}
}
words[wordIndex] |= (1L << bitIndex)解释看下面
这个我们讲下这个,转化下:words[wordIndex] =words[wordIndex] ||(1L << bitIndex);
先看下(1L << bitIndex) 说明:左移动数组的bitIndex 位,然后为1,怎么说呢?看下面吧
1L<<1 转化为2进制,10,
1L<<2 转化为2进制,100,
1L<<3 转化为2进制,1000,
这个是否明白,哈,然在看看下words[wordIndex] ||(1L << bitIndex),小G啰嗦下,bitset存的就是1或0的2进制数组,0代表为没有纯在这个集合,
1代表存在这个集合
这下是不是明白,就是我看看words[wordIndex]的数组是不是1,如有为1还是1(小G在啰嗦下,或就是两个只有有一个是1就是1,多读几次就知道)
- 再来看下get就比较简单
public boolean get(int bitIndex) {
if (bitIndex < 0)
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
//检测数据的assert
checkInvariants();
//获取数组的位置
int wordIndex = wordIndex(bitIndex);
// 如果是为0说明该书不存在
return (wordIndex < wordsInUse)
&& ((words[wordIndex] & (1L << bitIndex)) != 0);
}