RoaringBitmap的使用方法
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"RoaringBitmap的使用方法",在日常操作中,相信很多人在RoaringBitmap的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"R
千家信息网最后更新 2026年10月31日RoaringBitmap的使用方法
这篇文章主要介绍"RoaringBitmap的使用方法",在日常操作中,相信很多人在RoaringBitmap的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"RoaringBitmap的使用方法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1、简单Demo
参考: RoaringBitmap
public class Demo { @Test public void test1(){ // 向r1中添加1、2、3、1000四个数字 RoaringBitmap r1 = RoaringBitmap.bitmapOf(1, 2, 3, 1000); // 返回第3个数字是1000 System.out.println(r1.select(3)); r1.add(5); // 返回10000的索引,是4 System.out.println(r1.rank(1000)); System.out.println(r1.rank(3)); System.out.println(r1.rank(2)); System.out.println(r1.rank(1)); // 是否包含1000和7,true和false System.out.println(r1.contains(1000)); System.out.println(r1.contains(7)); RoaringBitmap r2 = new RoaringBitmap(); // 向r2添加10000-12000共2000个数字 r2.add(10000L, 12000L); // 将两个r1,r2进行合并,数值进行合并,合并产生新的RoaringBitmap RoaringBitmap r3 = RoaringBitmap.or(r1, r2); // r1和r2进行位运算,并将结果赋值给r1 r1.or(r2); // 判断r1与r3是否相等,true System.out.println(r1.equals(r3)); // 查看r1中存储了多少个值,2004 System.out.println(r1.getLongCardinality()); // 两种遍历方式 for(int i : r1){ System.out.println(i); } r1.forEach((Consumer super Integer>) i -> System.out.println(i.intValue())); } @Test public void test2(){ RoaringBitmap roaringBitmap = new RoaringBitmap(); roaringBitmap.add(1L, 10L); // 遍历输出 roaringBitmap.forEach((IntConsumer)i -> System.out.println(i)); // 遍历放入List中 List numbers = new ArrayList<>(); roaringBitmap.forEach((IntConsumer) numbers::add); System.out.println(numbers); roaringBitmap.runOptimize(); int size = roaringBitmap.serializedSizeInBytes(); ByteBuffer buffer = ByteBuffer.allocate(size); roaringBitmap.serialize(buffer); // 将RoaringBitmap的数据转成字节数组,这样就可以直接存入数据库了,数据库字段类型BLOB byte[] bitmapData = buffer.array(); }} // List变成RoaringBitmapprivate RoaringBitmap buildBitmap(ListidList) { RoaringBitmap roaringBitmap = new RoaringBitmap(); idList.forEach(id -> roaringBitmap.add(Integer.valueOf(id.trim()))); roaringBitmap.runOptimize(); return roaringBitmap;}
// a + b - cprivate RoaringBitmap mergeBitmap(Lista, List b, List c) { // a + b List blacklistBitMaps = Lists.newLinkedList(); blacklistBitMaps.addAll(a); blacklistBitMaps.addAll(b); RoaringBitmap blacklistBitMap = aggregationToBitMap(blacklistBitMaps); // c RoaringBitmap whitelistBitMap = aggregationToBitMap(c); // a + b - c blacklistBitMap.andNot(whitelistBitMap); return blacklistBitMap;}private RoaringBitmap aggregationToBitMap(List list) { if (CollectionUtils.isEmpty(list)) { return new RoaringBitmap(); } if (list.size() == 1) { return list.get(0); } return FastAggregation.or(list.listIterator());}
2、和数据库Blob字段结合使用
create table hobby( id int auto_increment primary key, name varchar(255) not null, hobbies blob null);
// 忽略get、set方法public class HobbyDO { private Integer id; private String name; private RoaringBitmap bitmap;}public interface HobbyDOMapper { int insert(HobbyDO record); HobbyDO selectByPrimaryKey(Integer id); Integer updateBitmap(@Param("id") Integer id, @Param("bitmap") byte[] bitmap);}public class HobbyBitmapBlobHandler extends BaseTypeHandler{ @Override public void setNonNullParameter(PreparedStatement ps, int i, RoaringBitmap parameter, JdbcType jdbcType) throws SQLException { byte[] content = serializeRoaringBitmap(parameter); if (content == null) { return; } ByteArrayInputStream bis = new ByteArrayInputStream(content); ps.setBinaryStream(i, bis, content.length); } @Override public RoaringBitmap getNullableResult(ResultSet rs, String columnName) throws SQLException { return deSerializeRoaringBitmap(rs.getBlob(columnName)); } @Override public RoaringBitmap getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return deSerializeRoaringBitmap(rs.getBlob(columnIndex)); } @Override public RoaringBitmap getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return deSerializeRoaringBitmap(cs.getBlob(columnIndex)); } private byte[] serializeRoaringBitmap(RoaringBitmap roaringBitmap) { if (roaringBitmap == null) { return null; } int size = roaringBitmap.serializedSizeInBytes(); ByteBuffer buffer = ByteBuffer.allocate(size); roaringBitmap.serialize(buffer); return buffer.array(); } private RoaringBitmap deSerializeRoaringBitmap(Blob blob) { if (blob == null) { return null; } byte[] content; try { content = blob.getBytes(1, (int) blob.length()); } catch (SQLException e) { e.printStackTrace(); return null; } ByteBuffer buffer = ByteBuffer.wrap(content); return new RoaringBitmap(new ImmutableRoaringBitmap(buffer)); }}
@Testpublic void insert() { HobbyDO hobby = new HobbyDO(); hobby.setName("lwh"); RoaringBitmap bitmap = new RoaringBitmap(); bitmap.add(111); bitmap.add(222); bitmap.add(333); hobby.setBitmap(bitmap); hobbyDOMapper.insert(hobby);}@Testpublic void update(){ RoaringBitmap bitmap = new RoaringBitmap(); bitmap.add(133); bitmap.add(222); bitmap.add(333); int size = bitmap.serializedSizeInBytes(); ByteBuffer buffer = ByteBuffer.allocate(size); bitmap.serialize(buffer); byte[] bitmapData = buffer.array(); hobbyDOMapper.updateBitmap(1, bitmapData);}@Testpublic void select(){ HobbyDO hobbyDO = hobbyDOMapper.selectByPrimaryKey(1); hobbyDO.getBitmap().forEach((IntConsumer) System.out::println);}到此,关于"RoaringBitmap的使用方法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
方法
使用方法
数据
学习
数字
数据库
字段
更多
帮助
实用
接下来
两个
字节
数值
数组
文章
方式
理论
知识
篇文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
手冲咖啡和咖啡机区别
互联网科技企业
科技互联网产品
新华互联网科技学院
互联网 科技创新
壕鑫互联网络科技
深圳前海聚择互联网科技有限公司
广州优美互联网科技
杭州壁岐互联网科技有限公司
互联网科技与大数据专业
本届互联网博览会上的黑科技
特约风豹互联网科技为什么扣费
互联网科技如何创业
无锡工业互联网科技有限公司
国产互联网科技公司
互联网科技机房
互联网公司属于科技吗
互联网科技手抄报图片
玉溪新华互联网科技怎么选
杭州科技互联网公司有哪些
朗涯互联网科技
上海致骋互联网科技
广州凡科互联网科技
万达互联网科技
长亮科技 互联网金融
互联网经济与金融科技
厦门江牛科技互联网
互联网科技融合创新
互联网领先科技成果宣传视频
互联网大会出现的黑科技