Java 有bitset集合,但是没有bitmap,bit*就是位图,代码如下<代码段>

有何用?

我们平时存储数据到集合,一般用hashmap,存储的基本单位就是字节,像Java基本类型int占用就是4个字节,即4*8=32位,要是存储上亿条数据,显然太耗费存储;若用位来表示,一位代表一个数据,数据存在就显示为1,不存在就是0,那就很节约空间了不是,使用场景可用来判断数据是否存在;

像一个字节范围内,0,3,7占用的位置表示如下:

数字 0 1 2 3 4 5 6 7
1 0 0 1 0 0 0 1

对应在map

中的存储位置,

通过某个算法(这里通过数据1往左移动n位来与该字节对应的数据或)来完成,

找到对应存储

1左移0位 00000001

1左移1位

00000010

1左移2位

00000100

1左移3位

00001000

...

1左移7位

10000000

核心逻辑:

public void add(int num) {//数组的哪个下标中int index = num / 8;//下标元素的哪个位置int position = num % 8;//1往左移位,目的是为了保证数值是0的也能有一位来表示,且能保证此数与byteBits[index]中已有   的数据,位错开byte tempBit = (byte) (1 << position);byteBits[index] = (byte) (byteBits[index] | tempBit);
}

解释下:

目的是为了保证数值是0的也能有一位来表示,且能保证此数与byteBits[index]中已有 的数据,位错开

例如:8,经过运算,得到存储到byteBits[1]里,position为0,存0肯定就不对了,没有体现存8,所以byteBits[1]里,存00000001,就好了,怎么表示呢:1 << position 。然后,解释下 位错开:举例,现在bitmap里存储了数据3,现在要新增存储数据5,我们通过int index = num / 8 计算出来,这两个数据都在byteBits[0]里,通过int position = num % 8又算出来3的位置为3(用二进制00000011)、5的位置为5(00000101),若5不往左移动1位,就直接进行byteBits[index] | tempBit 运算,显然00000011与00000101结果会重叠,即00000101,那就体现不出来已经存储的数据3了,往左移位呢,正好可以,结果为00001111;

然后判断是否包含某个数字:

首先将byte tempBit = (byte) (1 << position); 然后与byteBits[index]&tempBit,不为0就表示位上有1体现的数据存在,即包含这个数字的

public class Bitmap {//数据容器private byte[] byteBits;//最大值private int maxValue;//容量private int capacity;//构造器初始化public Bitmap(int maxValue) {this.maxValue = maxValue;//得出需要多少个bytethis.capacity = (maxValue / 8) + 1;byteBits = new byte[capacity];}public void add(int num) {//数组的哪个下标中int index = num / 8;//下标元素的哪个位置int position = num % 8;byte tempBit = (byte) (1 << position);byteBits[index] = (byte) (byteBits[index] | tempBit);}public boolean contains(int num) {int index = num / 8;int position = num % 8;byte tempBit = (byte) (1 << position);return (byteBits[index] & tempBit) != 0;}public static void main(String[] args) {Bitmap bitmap = new Bitmap(10);bitmap.add(9);bitmap.add(8);bitmap.contains(9);bitmap.contains(8);bitmap.contains(7);bitmap.contains(10);}
}

java bitmap 位图相关推荐

  1. java base64转bitmap,如何将Bitmap位图与base64字符串相互转换

    先引用delphi自带的单元 uses EncdDecd; 然后就可以使用下面二个函数了: ///将Bitmap位图转化为base64字符串 function BitmapToString(img:T ...

  2. 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究

    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的"高昂代价".位图索引会带来"位图段级锁",实际使用过程一定要充分了解不同索引带来的锁代价 ...

  3. redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用

    1.bitmap介绍 位图不是真正的数据类型,它是定义在字符串类型中,一个字符串类型的值最多能存储512M字节的内容 位上限:2^(9(512)+10(1024)+10(1024)+3(8b=1B)) ...

  4. linux中获取redis的map,深入Redis之 bitmap位图和HyperLogLog(五)

    bitmap位图 我们知道一个字符占1个字节,也就是8个位 例如 set name big big字符串中的3个字符的ASCII码为98 105 113 所以big转为二进制就是: 01100010| ...

  5. Redis(十一):Redis特殊类型之Bitmap位图

    1.位存储 只有0和1两种状态! Bitmap 位图:数据结构,都是操作二进制位来进行记录 登录/未登录 活跃/不活跃 打卡 两个状态的都可以使用Bitmap! 2.常用命令 2.1.用Bitmap来 ...

  6. Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解

    文章目录 Redis(十)--HyperLogLog 基数统计和 Bitmap位图场景详解 1.HyperLogLog 基数统计 2.Bitmap位图场景详解 Redis(十)--HyperLogLo ...

  7. oracle位图索引和普通索引区别,【索引】Bitmap位图索引与普通的B-Tree索引锁的比较...

    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的"高昂代价".位图索引会带来"位图段级锁",实际使用过程一定要充分了解不同索引带来的锁代价 ...

  8. java bitmap算法_BitMap算法详解

    所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间. 基本思想: 这此我用一个简单的例子来详细 ...

  9. Bitmap位图结构

    Bitmap位图结构 一.位图数据结构 BMP文件的数据按照从文件头开始的先后顺序分为四个部分: ◆ 位图文件头(bmp file header):  提供文件的格式.大小等信息 ◆ 位图信息头(bi ...

最新文章

  1. PyQt Qwidget笔记
  2. mysql5.6cmd中代码_Mysql5.6.22源代码安装
  3. 第 2 章:初出茅庐【初级篇 - 2.2 贪心算法】
  4. 面试官: 平时开发中你用过读写锁吗?
  5. mysql 自定义函数function,函数和存储过程的区别
  6. 【Python学习】 - sklearn学习 - 评估指标precision_score的参数说明
  7. Linux 内核宏 time_after解析
  8. linux 无法打开.ttf_win7系统ttf文件打不开怎么办【解决方法】
  9. C++ const对象
  10. 为应用程序池**提供服务的进程意外终止。进程ID是**。进程退出代码是'0x80'
  11. Spring Boot 2.0---使用Swagger2构建强大的API文档
  12. creator图片循环显示_Cocos creator 游戏背景循环滚动--Javascript编写
  13. win7 C盘空间越来越小 Windows文件夹变大的问题
  14. Python安装包下载方式
  15. 机器学习实战 2.3获取数据
  16. EmmyLua For Intellij IDEA注解功能的一些用法
  17. MySQL原理与实践(二):一条update语句引出MySQL日志系统
  18. 数学建模更新13(MATLAB绘制三维图【上】)
  19. python写文字冒险游戏手机版_用128行代码实现一个文字冒险游戏
  20. 手机电池电量剩余通知

热门文章

  1. autojs实现自动答题、复诵答案、100%正确率
  2. math里面的四舍五入
  3. 注册之获取短信验证码
  4. Android sdk 21~23 WebView加载报错
  5. 我想要你为我披上白色的婚纱
  6. UVa 211 The Domino Effect 多米诺效应 暴力搜索
  7. 并行编程——OpenMP
  8. 微机原理--第三章(6)移位指令
  9. 常见的http面试问题
  10. 阿里云服务器存在恶意挖矿程序