【原创】MultiBitSet-BitSet扩展

来源:互联网 发布:斗直播软件 编辑:程序博客网 时间:2024/06/04 20:14
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 地址

     https://github.com/lepdou/common-lang/blob/master/src/main/java/org/lepdou/common/MultiBitSet.java
0 0
原创粉丝点击