为何RoaringBitmap能成为Java里面事实上的位操作的标准结构

背景

说道位操作的数据结构,我们知道java中的BitSet,RoaringBitmap等,但是事实上,由于BitSet等结构的缺陷,比如当数值很大时占用的内存甚至超过使用整数数组存储整数本身,所以一般我们都会使用RoaringBitmap,那么RoaringBitmap如何做到兼顾了存储性能和操作性能呢?

RoaringBitmap位操作存储优势

先看下RoaringBitmap的结构图:
为何RoaringBitmap能成为Java里面事实上的位操作的标准结构_第1张图片
总结下RoaringBitmap作为位操作存储的首选的两个要点:
1.RoaringBitmap存储某个整数时,首先获取每个整数值的高16位,然后把这个整数分到2^16次方的Container中的某一个Container中
2.对于其中的每个Container,他有三个子类的实现,根据数据的特征选择不同的Container实现,比如当这个Container的数据量比较少时,使用ArrayContainer结构存放,当数据量比较多时,切换到BitmapContainer结构存放
3.存放在每个Container中的只是整数的低16位数值

彩蛋:

我们想要评估RoaringBitmap存放比如100w整数时占用的内存时,这100w整数分布不均匀和分布均匀时的结果会不一样,你知道为什么吗?
提示:看上面Container三个子类的互相转换条件

你可能感兴趣的:(java,工具类,java性能,java)