源码系列工具类
FixedBitSet
FixBitSet 类在 Lucene 中属于一个工具类(Util),它的其中一个用途用来存储文档号,用一个 bit 位来描述(存储)一个文档号。该类特别适合存储连续并且没有重复的 int 类型的数值。最好情况可以用 8 个字节来描述 64 个 int 类型的值。下面通过介绍几个 FixBitSet 类的方法来理解这个类的存储原理。本篇文章纯属充数。。。直接看源码的话不会花很多时间,写这篇文章的原因主要是出于总结,因为好几个月前我看过了这个类的源码,今天准备写关于 NumericDocValues 的文章时再次遇到这个类时,发现又忘了,囧。
构造函数
|
|
构造一个 FixedBitSet 对象,参数 numBits 用来确定需要多少 bit 位来存储我们的 int 数值。如果我们另 numBits 的值为 300,实际会分配一个 64 的整数倍的 bit 位。因为比 300 大的第一个 64 的倍数是 320 (64 * 5),所以实际上我们可以存储 [0 ~319]范围的数值。最终根据 320 的值,我们获得一个 long 类型的 bit[]数组,并且 bit[]数组初始化为大小 5。在这里我们发现 bit[]数组的每一个元素是 long 类型,即 64bit,所以 5 个元素一共有 64 * 5 共 320 个 bit 位。
void set(int index)方法
|
|
例子:
图 1:
添加 3
|
|
图 2:
添加 67
|
|
图 3:
添加 120
|
|
图 4:
添加 179、195、313
不赘述,大家可以自己算下是不是跟下图中一致。
图 5:
通过上面的例子可以看到,如果我们存储的是连续的值,那么压缩率是很高的。当然同时可以看出无法处理有相同值的问题。
boolean get(int index)方法
get()方法可以实现随机访问,来确定 index 的值是否在 bit[]数组中。
|
|
结语
FixedBitSet 类中还有一些其他的方法,比如说 prevSetBit(int index)方法来找到第一个比 index 小的值和 nextSetBit(int index)
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%BA%90%E7%A0%81%E7%B3%BB%E5%88%97%E5%B7%A5%E5%85%B7%E7%B1%BB/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com