BitMap-BitSet(JDK1.8)基本使用入门
1.BitMap说明
本文是BitMap系列文章,
BitMap就是位图,
使用bit位来标记数值,
本文不介绍BitMap具体实现,
如果不清楚请见文末参考文章。
2.BitSet说明
本文介绍JDK中的BitSet,
是Java自带的BitMap的一种实现,
下面的示例代码基于JDK1.8。
BitSet实现了一个位向量,
它可以根据需要增长。
每一位都有一个布尔值,
默认值为false。
一个BitSet的位可以被非负整数索引,
即每一位都可以表示一个非负整数。
可以查找、设置、清除某一位。
BitSet可以进行逻辑运算,
包括逻辑与、或和异或。
3.构造方法
// 1.默认构造方法,位的大小默认为64
BitSet bs1 = new BitSet();
// 2.指定位的初始大小,实际为64
BitSet bs2 = new BitSet(16);
// 3.使用其他BitMap或者long数组创建
BitSet bs3 = BitSet.valueOf(bs2.toLongArray());
BitSet操作的对象是bit位,
值只有0或1,
可以对应false和true,
内部维护了一个long数组,
初始数组只有一个元素,
所以BitSet最小的nbits是64,
上面的第2个构造方法指定nbits时,
会把nbits除以64,然后加1,
作为long数组的初始化size,
注意nbits不能小于0。
当随着存储的元素越来越多,
BitSet内部会动态扩充,
最终内部是由N个long来存储。
4.设置,查找,清除操作
public static void testGetSetClear() {BitSet bs = new BitSet();int num = 9;// 设置num后,查询num,应该存在bs.set(num);boolean exist = bs.get(num);System.out.println(num + " set, exist= " + exist);// 清除num后,查询num,应该不存在bs.clear(num);exist = bs.get(num);System.out.println(num + " remove, exist= " + exist);
}
运行代码输出:
9 set, exist= true
9 remove, exist= false
5.逻辑运算
public static void testLogicOperation() {BitSet bs1 = new BitSet();BitSet bs2 = new BitSet();// 添加一些整数到BitSet中for (int i = 0; i < 11; i++) {if ((i % 2) == 0) {bs1.set(i);}if ((i % 5) != 0) {bs2.set(i);}}// 按照从小到大的顺序打印数组System.out.println("Initial pattern in bs1: ");System.out.println(bs1);System.out.println("\nInitial pattern in bs2: ");System.out.println(bs2);// 备份原始的bs2,下面的逻辑操作会修改bs2BitSet bs2Origin = BitSet.valueOf(bs2.toLongArray());// 1.AND 交集,取出相同的数字bs2.and(bs1);System.out.println("\nbs2 AND bs1: ");System.out.println(bs2);// 2.OR 并集,取出所有的数字bs2 = BitSet.valueOf(bs2Origin.toLongArray());bs2.or(bs1);System.out.println("\nbs2 OR bs1: ");System.out.println(bs2);// 3.XOR 差集, bs2和bs1中不相同的数字集合bs2 = BitSet.valueOf(bs2Origin.toLongArray());bs2.xor(bs1);System.out.println("\nbs2 XOR bs1: ");System.out.println(bs2);// 4.AND NOT 差集,bs2中不存在于bs1中的数字的集合bs2 = BitSet.valueOf(bs2Origin.toLongArray());bs2.andNot(bs1);System.out.println("\nbs2 AND NOT bs1: ");System.out.println(bs2);
}
运行代码输出:
Initial pattern in bs1:
{0, 2, 4, 6, 8, 10}Initial pattern in bs2:
{1, 2, 3, 4, 6, 7, 8, 9}bs2 AND bs1:
{2, 4, 6, 8}bs2 OR bs1:
{0, 1, 2, 3, 4, 6, 7, 8, 9, 10}bs2 XOR bs1:
{0, 1, 3, 7, 9, 10}bs2 AND NOT bs1:
{1, 3, 7, 9}
6.实现排序去重
如下有一组无序的整数:
{ 1, 2, 3, 29, 22, 0, 3, 29 }
使用BitMap进行排序和去重,
同时展示了更多的BitMap的用法:
public static void testSortAndUniqueArray() {int[] array = new int[] { 1, 2, 3, 29, 22, 0, 3, 29 };BitSet bitSet = new BitSet(array.length);// 将数组内容组bitmapfor (int i = 0; i < array.length; i++) {bitSet.set(array[i], true);}System.out.println("bitset可以存储的数量:" + bitSet.size());System.out.println("bitset实际存储的数量:" + bitSet.cardinality());System.out.println("排序去重后:" + bitSet);// 使用迭代器访问数据System.out.print("迭代器输出:");Iterator<Integer> iterator = bitSet.stream().iterator();StringJoiner sj = new StringJoiner(",", "{", "}");while (iterator.hasNext()) {sj.add(String.valueOf(iterator.next()));}System.out.println(sj);
}
运行代码输出:
bitset可以存储的数量:64
bitset实际存储的数量:6
排序去重后:{0, 1, 2, 3, 22, 29}
迭代器输出:{0,1,2,3,22,29}
7.参考文章
Bitmap简介
http://www.taodudu.cc/news/show-1250940.html
相关文章:
- IDEA查看Java类的UML关系图
- 30. 包含min函数的栈
- 35. 复杂链表的复制
- 58 - II. 左旋转字符串
- 03. 数组中重复的数字
- 53 - II. 0~n-1中缺失的数字
- 04. 二维数组中的查找
- 11. 旋转数组的最小数字
- 50. 第一个只出现一次的字符
- 32 - I. 从上到下打印二叉树
- 32 - II. 从上到下打印二叉树 II
- 32 - III. 从上到下打印二叉树 III
- 26. 树的子结构
- PostgreSQL数据库密码
- SpringBoot中使用Hibernate Validator校验工具类
- 28. 对称的二叉树
- 解决tomcat的undeploy
- 解决eclipse出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
- 下载安装neo4j
- vue-drag-resize实线页面的拖拽与缩放
- 解决IDEA不能编译XML文件
- 播放视频和音频文件java
- 实时获取屏幕大小
- vue部分样式无法修改
- vue中根据搜索内容跳转到页面指定位置
- Duplicate entry ‘‘ for key ‘***‘
- transferto遇到的问题java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp
- Spring的jar包下载
- *** is required and cannot be removed from the server
- Tomcat 服务器介绍和使用
BitMap-BitSet(JDK1.8)基本使用入门相关推荐
- JDK1.9-网络编程入门
第一章 网络编程入门 1.1软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构 :全称为Browser/Server结构,是 ...
- Guava事件处理组件Eventbus使用入门
1.说明 EventBus是Google Guava的事件处理机制, 是设计模式中观察者模式的优雅实现, 是一个进程内的生产者/消费者模型. 为了解耦事件的发布和订阅, 使用EventBus组件, 是 ...
- 最新Android基础入门教程目录(完结版)
第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...
- 【数据结构】BitMap
目录 一.BitMap介绍 二.BitMap应用场景 1.查询统计.定位查询,排序,去重 2.取两个集合的交集,并集等 三.BitMap的实现 1.自己动手实现BitMap 2.JDK中实现的BitM ...
- 2015年最新Android基础入门教程目录(完结版)
2015年最新Android基础入门教程目录(完结版) 标签(空格分隔): Android基础入门教程 前言: 关于<2015年最新Android基础入门教程目录>终于在今天落下了帷幕,全 ...
- java adt入门教程_Android基础入门教程目录
第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...
- 安卓开发基础入门系列教程
第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...
- PowerDesigner运行自定义VBS脚本,复制Name到Comment
1.说明 PowerDesigner支持自定义一些命令与操作, 通过编写VBS(Visual Basic Script)脚本, 可以扩展出更多的功能. 下面开发一个自定义的VBS脚本, 实现复制Nam ...
- SNMP客户端工具MIB Browser
1.说明 SNMP客户端工具MIB Browser, 全名iReasoning MIB Browser, 是一个功能强大.易于使用的MIB管理工具, 支持Windows,Linux,MACOS等多种平 ...
最新文章
- NYOJ 420 p次方求和 大数的幂
- 高斯背景建模 matlab,高斯背景建模整理 – 要饭的
- 微信小程序|开发实战篇之一
- 【视频】LSTM神经网络架构和原理及其在Python中的预测应用|数据分享
- Java实现简易文本编辑器
- wechat微信模板消息推送demo
- 软考中级软件设计师--6.UML
- 联通bss转cbss_携号转网山西联通经业务系统受理的首张携入号码开卡成功
- 倒闭潮之后 快消B2B要如何做才能实现盈利
- pycharm 破解
- 小白学 Python(2):基础数据类型(上)
- mybatis中resultMap和resultType的详细用法
- Oracle序列的概念、创建和使用
- 完美实现文字图片水平垂直居中
- 攻防世界shanghai
- 用TTL线在CFE环境下拯救半砖wrt54g路由器
- 牛奶百度指数批量查询工具【强烈推荐】
- Typora代码自动排版
- 机械自动化原理动图,你都见过吗?
- 泛型会让你的 Go 代码运行变慢