BitSet源码的解读

  小G今天看下布隆过滤器(有误差),主要判断集合是否存在,其实布隆里面有一个知识点,就是BitSet
我今天先说明下bitSet后续有时间我在写下布隆过滤器
首先看下java.util.BitSet

  1. 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,多读几次就知道)

  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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章