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)基本使用入门相关推荐

  1. JDK1.9-网络编程入门

    第一章 网络编程入门 1.1软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构 :全称为Browser/Server结构,是 ...

  2. Guava事件处理组件Eventbus使用入门

    1.说明 EventBus是Google Guava的事件处理机制, 是设计模式中观察者模式的优雅实现, 是一个进程内的生产者/消费者模型. 为了解耦事件的发布和订阅, 使用EventBus组件, 是 ...

  3. 最新Android基础入门教程目录(完结版)

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  4. 【数据结构】BitMap

    目录 一.BitMap介绍 二.BitMap应用场景 1.查询统计.定位查询,排序,去重 2.取两个集合的交集,并集等 三.BitMap的实现 1.自己动手实现BitMap 2.JDK中实现的BitM ...

  5. 2015年最新Android基础入门教程目录(完结版)

    2015年最新Android基础入门教程目录(完结版) 标签(空格分隔): Android基础入门教程 前言: 关于<2015年最新Android基础入门教程目录>终于在今天落下了帷幕,全 ...

  6. java adt入门教程_Android基础入门教程目录

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  7. 安卓开发基础入门系列教程

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  8. PowerDesigner运行自定义VBS脚本,复制Name到Comment

    1.说明 PowerDesigner支持自定义一些命令与操作, 通过编写VBS(Visual Basic Script)脚本, 可以扩展出更多的功能. 下面开发一个自定义的VBS脚本, 实现复制Nam ...

  9. SNMP客户端工具MIB Browser

    1.说明 SNMP客户端工具MIB Browser, 全名iReasoning MIB Browser, 是一个功能强大.易于使用的MIB管理工具, 支持Windows,Linux,MACOS等多种平 ...

最新文章

  1. NYOJ 420 p次方求和 大数的幂
  2. 高斯背景建模 matlab,高斯背景建模整理 – 要饭的
  3. 微信小程序|开发实战篇之一
  4. 【视频】LSTM神经网络架构和原理及其在Python中的预测应用|数据分享
  5. Java实现简易文本编辑器
  6. wechat微信模板消息推送demo
  7. 软考中级软件设计师--6.UML
  8. 联通bss转cbss_携号转网山西联通经业务系统受理的首张携入号码开卡成功
  9. 倒闭潮之后 快消B2B要如何做才能实现盈利
  10. pycharm 破解
  11. 小白学 Python(2):基础数据类型(上)
  12. mybatis中resultMap和resultType的详细用法
  13. Oracle序列的概念、创建和使用
  14. 完美实现文字图片水平垂直居中
  15. 攻防世界shanghai
  16. 用TTL线在CFE环境下拯救半砖wrt54g路由器
  17. 牛奶百度指数批量查询工具【强烈推荐】
  18. Typora代码自动排版
  19. 机械自动化原理动图,你都见过吗?
  20. 泛型会让你的 Go 代码运行变慢

热门文章

  1. geoserver矢量瓦片发服务前端展示偏移问题解决
  2. js中if表达式判断规则
  3. JavaWeb调用python脚本(可传参)
  4. 获取占用fd最大的前20个进程
  5. 三、面向对象——9-初始化块
  6. CF #371 (Div. 2) C、map标记
  7. Traffic Manager Overview
  8. HTTP -- 目录
  9. C#核心概念--装箱和拆箱(什么是装箱和拆箱)
  10. c# mysql 连接串_c# – 如何形成一个正确的MySQL连接字符串?