举个例子,如下图,如果我们想要存放 0,2,4,5,10,11,12,14,15这几个数字,如果采用普通存储方式,若4位表示一个数字,这9个数字需要4*9=36位,至少36位才能存储这些数据。

如果采用位图的方式,只需要上图的16位就能存储这9个数字。

查找的时候,只需要查找这个位的数是1还是0即可,就可以确定该数存在不存在。

当数量足够大时候,不光大大压缩了存储空间,查找速率也极快,可以说是O(1)。

接下来我们看一下思路:

位图的实现,主要在于实现两个功能,一个是获取该位置的值,一个是设置该位置的值。

获取:

我们使用byte类型的数组来实现位图,byte类型在Java占1个字节也就是8位,可以存放8个数据。

先求是第几个字节:number/8;

再求该字节的第几个(0-7):i=number%8;

将这个字节数右移(7-i)位(也就是把要查找的位移动到最右侧),然后与 0000 0001相与,得到结果是0或1就可以确定。

public boolean get(int number){

//获取位置int site=number>>>3;//等价于 site=number/8//获取该字节byte temp=bitmap[site];

//获取该字节的第几个int i=number&7;//等价于 i=number%8

//将这个字节数右移(7-i)位(也就是把要查找的位移动到最右侧),然后与 0000 0001相与if(((temp>>>(7-i))&1)==0){

return false;

}

return true;

}

设置该位置的值:

也要先求是第几个字节:number/8;

再求该字节的第几个(0-7):i=number%8;

如果要设置为1:

将0000 0001 左移(7-i),此时’1’对应的位置就是该数对应位置,然后和该字节取“或”。

如果要设置为0:

将0000 0001 左移(7-i),此时’0’对应的位置就是该数对应位置,取反,然后和该字节相与。

private void set(int number, boolean bool){

//获取位置int site=number>>>3;//等价于 site=number/8//获取该字节byte temp=bitmap[site];

//获取该字节的第几个int i=number&7;//等价于 i=number%8//将0000 0001 左移(7-i)byte comp= (byte) (1<

if(bool){//设置为1bitmap[site]= (byte) (comp|temp);//取或(0.. 1 0..)}else {//设置为0comp= (byte) ~comp;//取反bitmap[site]= (byte) (comp&temp);//相与(1.. 0 1..)}

}

当存储相对范围比较小,数量特别大的情况下,使用位图的存储空间比直接存储要少得多,查找效率远比直接存储快得多。

所以特定条件下,使用位图能够大大提高存储效率和查找效率。

以下为全部代码:

/*** @Author: GoodbyeLullaby* @Date: 2019/12/2*/

public class Bitmap {

private byte bitmap[];

private int length;

public boolean get(int number){

//获取位置int site=number>>>3;//等价于 site=number/8//获取该字节byte temp=bitmap[site];

//获取该字节的第几个int i=number&7;//等价于 i=number%8byte comp=1;

//将这个字节数右移(7-i)位(也就是把要查找的位移动到最右侧),然后与 0000 0001相与if(((temp>>>(7-i))&1)==0){

return false;

}

return true;

}

private void set(int number, boolean bool){

//获取位置int site=number>>>3;//等价于 site=number/8//获取该字节byte temp=bitmap[site];

//获取该字节的第几个int i=number&7;//等价于 i=number%8//将0000 0001 左移(7-i)byte comp= (byte) (1<

if(bool){//设置为1bitmap[site]= (byte) (comp|temp);//取或(0.. 1 0..)}else {//设置为0comp= (byte) ~comp;//取反bitmap[site]= (byte) (comp&temp);//相与(1.. 0 1..)}

}

public void add(int index){

set(index,true);

}

public void delete(int index){

set(index,false);

}

public Bitmap (int length){

this.length=length;

bitmap=new byte[length>>>3];

}

public int getLength() {

return length;

}

public static void main(String[] args){

Bitmap bitmap=new Bitmap(100000);

bitmap.add(100);

System.out.println(bitmap.get(100));

bitmap.delete(100);

System.out.println(bitmap.get(100));

}

}

java位图_位图Bitmap及其Java实现相关推荐

  1. java风控_【A0538】[java视频教程]金融信贷风控的机器学习实战视频教程 it教程

    Java视频教程名称:金融信贷风控的机器学习实战视频教程  java自学   风控视频教程   it教程 7 E" b1 z7 `/ _& G百度网盘下载链接:8 }, g4 o5 ...

  2. 我的世界java路径_我的世界java路径在哪 路径有误怎么设置

    我的世界的各个版本中java都是十分重要的东西,许多玩家都会遇到Java路径有误的问题,并且不知道该如何解决,其实Java的路径这个东西在每个人的电脑中都是不太一样的,一般以你安装时的位置为准,在这里 ...

  3. 如何创建第一个java程序_创建第一个java程序

    开发环境:ubuntu 10.04 + eclipse 方法一:打开eclipse编译器,选择 File->New->Java project,输入工程名称,点击finish,在工程目录中 ...

  4. 常用的java虚拟机_带你了解 JAVA虚拟机 面试必备

    Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有 些区域则是依赖 ...

  5. vs java调试_基于VSCode的Java编程语言的构建调试环境搭建指南(作业三)

    1.Java编译环境的搭建(CodeRunner) CodeRunner的强大之处在于它支持许多语言,只要选好语言,就直接可以写代码,即开即用的模式.时至今日,Code Runner已经有了超过400 ...

  6. java 精通_你真的精通Java吗?

    简历和自我介绍上经常能够读到"精通Java"这样的话,有人和我说,精通Java的人太多了,精通Java已经不能算亮点.不能给自己加分了.可是事实真是这样吗? 对于语言的学习,我有一 ...

  7. java相册_精致小巧的java相册制作方法

    本文实例为大家分享了java相册制作方法,供大家参考,具体内容如下 注: 1)html上的图片是静态指定的.当更新了新的图片时必须手工更新.所以使用Servlet读取本地images中的所有图片,动态 ...

  8. java内核_测量时间:从Java到内核再到

    java内核 问题陈述 当您深入研究时,即使是最基本的问题也会变得很有趣. 今天,我想深入研究一下Java时间. 我们将从Java API的最基础知识开始,然后逐步降低堆栈:通过OpenJDK源代码g ...

  9. java基准测试_星期五基准功能Java

    java基准测试 让我们的产品所有者有一天变得疯狂,并要求您执行以下操作: From a set of Strings as follows : " marco_8"," ...

最新文章

  1. underscore
  2. php排字符串的高低位怎么区分,PHP-根据字符串和所用字体计算字符串所占宽高...
  3. 安卓进阶系列-02搜索框(PersistentSearch)的使用
  4. 短信宝 php使用,[php] 使用 短信宝 发送短信(thinkphp)
  5. LDAP命令介绍---dstune
  6. GitHub开源项目 - Jeecg-Boot开始开发平台介绍
  7. 初学java之Map接口
  8. Windows下调试hadoop
  9. 解决gitlab内存占用过多的问题
  10. [资源数据]民族代码
  11. 大一新生计算机掌握情况word,2021年大一计算机学习心得word版
  12. (附源码)springboot猪场管理系统 毕业设计 160901
  13. P4167 [Violet]樱花
  14. Protoss and Zerg(快速幂)
  15. iOS 手势的用法
  16. 阿里,淘宝,天猫,京东2012年的大概销售额
  17. html 5 时代来了 视频播放还用falsh 还要找播放器 你out 了
  18. spring中 shiro logout 配置方式
  19. 同步发电机转子的转动惯量与运动方程(二) 同步发电机的转子运动方程
  20. 征服上司站稳脚13招

热门文章

  1. php定时执行任务,PHP定时执行任务的3种方法详解
  2. UG NX二次开发(C#)-最小包容体(块)
  3. 【poi第五节】poi设置Excel单元格边框 和 背景色,java设置Excel 单元格边框 和 背景色
  4. 尚观学习-ule-权限
  5. apt-get 更换源
  6. 前端vue项目-关于下载文件pdf/excel
  7. Pytorch的冻结以及解冻
  8. 程序员的幸福生活——有你的日子,每天都是情人节
  9. mysql错误1053 服务没有及时响应启动或控制请求_windows服务安装启动报错误1053:服务没有及时响应启动或控制请求...
  10. @Bean的方法中如何注入同一个@Configuration注解的类里的其他@Bean注解的bean