第29篇 rabbitmq BitSet源码分析

本文详细解读Java BitSet源码,涉及构造方法、成员变量、关键方法如flip和set,以及应用场景如布尔过滤和状态判断。通过剖析BitSet如何用long数组表示64位,实现位操作和内存管理。

上节IntAllocator是对于BitSet的应用,我们来具体学习BitSet源码

  • 默认情况下所有bit初始化都是false

  • 不能设置null值

  • 不是线程安全的,需要外层做同步

  • BitSet实现Cloneable 和 Serializable接口(说明它具有克隆和序列化功能)

  • BitSet被打包成"字"数组,目前一个字是一个long, 由64位组成,需要6个地址位,也就移动1<<6==64

image-20210705162728426

  1. 二进制表示0或1,long是8byte, 64bit,也就是一个long可以表示64数字是否存在(0或1),那么如果一个long满怎么办,当然使用下一个long值,所有现在对BitSet有直观的印象,它用long表示64个数字,0-63就存第一个long值中
  2. 如图1,2都是words数组的word元素,一个word表示64个数字是否存在。
  3. 怎么确定某个值在BitSet的哪里表示呢?,首先需要找到对应word(取模64), 然后找到word对应位(bit)

1、成员变量和常量

名称默认值描述
int ADDRESS_BITS_PER_WORD6地址位6位
int BITS_PER_WORD1 << ADDRESS_BITS_PER_WORD64
int BIT_INDEX_MASKBITS_PER_WORD-163
long WORD_MASK0xffffffffffffffffL-1 (64位全是1)
ObjectStreamField[] serialPersistentFieldsnew ObjectStreamField(“bits”, long[].class)此BitSet中的位。第i位存储在位[i/64]中的位位置i%64(其中位位置0表示最低有效位,63表示最高有效位)
long[] words对应就是bits
transient int wordsInUse0words在用的length
transient boolean sizeIsStickyfalse"单词"的大小是否由用户指定words数量,如果是,就是true,经过一次扩容之后就是false了

2、方法

方法名描述图示
BitSet()构造方法
,sizeIsSticky=false
word=long[1] (右移6位)+1为数组大小
BitSet(int nbits)构造方法
,sizeIsSticky=true
就是说你需要这么多nbits到底需要多少个word进步保存呢
BitSet(long[] words)直接传入words数组,直接定义word,一个word可以表示64个bit
static BitSet valueOf(longs)它会去掉空long值(也就对这个word根本就没有使用)构建BitSet
byte[] toByteArray()转换成byte数组
long[] toLongArray()转换成long数组
void flip (int bitIndex)反转某个位的值,由1变成0,或由0变成1
void flip (int fromIndex, int toIndex)反转一段值[fromIndex,toIndex)1
void set(int bitIndex)设置某个bit为1
void set(int fromIndex, int toIndex)设置一个范围内bit为1,跟flip类似,只是最后是或运算,不是异或运算
void clear(int bitIndex)对应bit位设置为0
BitSet get(int fromIndex, int toIndex)获取一段bit位的BitSet
int nextSetBit(int fromIndex)获取下一个已经设置的bit位的位置
Long.numberOfTrailingZeros(word)取最后一个1位对应后面跟着0的个数,比如1111 1000,这就是3
int nextClearBit(int fromIndex)下一个空闲bit位置,也就是值为0
boolean intersects(BitSet set)两个BitSet是否存在交集
void and(BitSet bitset)进行and运算
void or(BitSet bitset)进行or运算
void xor(BitSet bitset)异或运算

2.1、void flip(int fromIndex, int toIndex)

  • image-20210705204108853

3、总结

  1. 找到对应word
  2. 是否需要扩容
  3. 找到对应bit 位
  4. 做对应操作

4、应用场景思考

  1. 布尔过滤过滤器
  2. 应用两种状态字段的值,比如判断某个用户是否登录。

参考

  1. Java1.8-BitSet源码分析
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值