java bitmap 位图
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 位图相关推荐
- java base64转bitmap,如何将Bitmap位图与base64字符串相互转换
先引用delphi自带的单元 uses EncdDecd; 然后就可以使用下面二个函数了: ///将Bitmap位图转化为base64字符串 function BitmapToString(img:T ...
- 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究
通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的"高昂代价".位图索引会带来"位图段级锁",实际使用过程一定要充分了解不同索引带来的锁代价 ...
- redis 中一个字段 修改map_Redis bitmap 位图 从入门到精通 基础 实战 妙用
1.bitmap介绍 位图不是真正的数据类型,它是定义在字符串类型中,一个字符串类型的值最多能存储512M字节的内容 位上限:2^(9(512)+10(1024)+10(1024)+3(8b=1B)) ...
- linux中获取redis的map,深入Redis之 bitmap位图和HyperLogLog(五)
bitmap位图 我们知道一个字符占1个字节,也就是8个位 例如 set name big big字符串中的3个字符的ASCII码为98 105 113 所以big转为二进制就是: 01100010| ...
- Redis(十一):Redis特殊类型之Bitmap位图
1.位存储 只有0和1两种状态! Bitmap 位图:数据结构,都是操作二进制位来进行记录 登录/未登录 活跃/不活跃 打卡 两个状态的都可以使用Bitmap! 2.常用命令 2.1.用Bitmap来 ...
- Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解
文章目录 Redis(十)--HyperLogLog 基数统计和 Bitmap位图场景详解 1.HyperLogLog 基数统计 2.Bitmap位图场景详解 Redis(十)--HyperLogLo ...
- oracle位图索引和普通索引区别,【索引】Bitmap位图索引与普通的B-Tree索引锁的比较...
通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的"高昂代价".位图索引会带来"位图段级锁",实际使用过程一定要充分了解不同索引带来的锁代价 ...
- java bitmap算法_BitMap算法详解
所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间. 基本思想: 这此我用一个简单的例子来详细 ...
- Bitmap位图结构
Bitmap位图结构 一.位图数据结构 BMP文件的数据按照从文件头开始的先后顺序分为四个部分: ◆ 位图文件头(bmp file header): 提供文件的格式.大小等信息 ◆ 位图信息头(bi ...
最新文章
- PyQt Qwidget笔记
- mysql5.6cmd中代码_Mysql5.6.22源代码安装
- 第 2 章:初出茅庐【初级篇 - 2.2 贪心算法】
- 面试官: 平时开发中你用过读写锁吗?
- mysql 自定义函数function,函数和存储过程的区别
- 【Python学习】 - sklearn学习 - 评估指标precision_score的参数说明
- Linux 内核宏 time_after解析
- linux 无法打开.ttf_win7系统ttf文件打不开怎么办【解决方法】
- C++ const对象
- 为应用程序池**提供服务的进程意外终止。进程ID是**。进程退出代码是'0x80'
- Spring Boot 2.0---使用Swagger2构建强大的API文档
- creator图片循环显示_Cocos creator 游戏背景循环滚动--Javascript编写
- win7 C盘空间越来越小 Windows文件夹变大的问题
- Python安装包下载方式
- 机器学习实战 2.3获取数据
- EmmyLua For Intellij IDEA注解功能的一些用法
- MySQL原理与实践(二):一条update语句引出MySQL日志系统
- 数学建模更新13(MATLAB绘制三维图【上】)
- python写文字冒险游戏手机版_用128行代码实现一个文字冒险游戏
- 手机电池电量剩余通知