【原创】MultiBitSet-BitSet扩展

1.BitSet

     BitSet其本质是01序列,0|1 两种状态可以表示 “是|否”、“开|关”等。一个01序列,例如 0110101001。可以用来表示一组数据的状态信息例如连续的UserId,0表示男生,1表示女生。假设UserId是从6666开始的,那么上面的01序列可以表达的信息是:【6666,男生】,【6667,女生】,【6668,女生】......这样10个bit位就能表达如此多的信息,效果上和Map<UserId,Boolean>一致的。当数据量小的时候,可以简单的通过Map实现,但是当数据量极大的时候,可能会导致无法加载所有的ID到内存中,这个时候BitSet就非常有用啦。
假设ID 4个字节表示,Boolean1个字节,那么压缩比就是 40:1,这个相当可观的。
     缺点一:从上面的结论可以看出一个问题,如果ID稀疏将导致内存浪费。假设一个极限情况只有两个ID,1和10000.那么bit序列表示为 10000….(9998个0)....1 那么中间的9998个0都是浪费了,还不如map内存占用少。
所以需要根据实际情况选择。
     缺点二:原生的API只能支持0|1,有时候需要更多的信息,比如会员的来源,可能有10几种类型。当然最简单的情况维护10几个BitSet,每一个BitSet维护一种类型的会员信息,每次遍历全部BitSet查询。可以看出这种方式不够优雅, 如果每一位能够表达更多的信息岂不是更好?

2.MultiBitSet

    1.介绍
     MultiBitSet扩展BitSet使其支持多位表示一位,3个物理bit表示逻辑上的1bit,那么“1位”就能表示八种状态。本人在实现的时候,基本上实现了BitSet的接口,使用起来非常方便。

Demo
     
 
2.API

 

3.GitHub 地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值