Bitmap位图(Java实现)

简介: 本文介绍了使用Java实现一个简单的Bitmap,通过自定义byte数组存储数据,提供put和exist方法分别用于插入数据和查询数据是否存在。Bitmap利用位操作高效地管理大量布尔值,适用于空间优化的场景。代码中详细解释了位图的核心原理、方法实现及边界检查。后续计划探讨位图在海量数据去重中的应用及JDK BitSet源码分析。

要求

用Java来实现个Bitmap,实现两个方法,put方法往里面插入数据,exist方法判断value在位图里是否存在。不能用Java的工具类,你要自己写个byte数组来实现

代码实现和解释说明

public class BitMap {
   

    private byte[] bitmap;
    private int size;

    public BitMap(int size) {
   
        this.size = size;
        this.bitmap = new byte[(size >> 3) + 1];
    }

    public void put(int value) {
   
        if (value < 0 || value > size) {
   
            throw new IllegalArgumentException("Value out of range");
        }
        //等价 value / 8 确定在数组的下标
        int byteIndex = value >> 3;
        //等价 value % 8 确定在byte元素中的下标
        int bitIndex = value & 7;
        //是位或赋值运算,作用是将对应位设置为 1,而其他位保持不变
        // 1 << bitIndex 将对应位置设为1,如value是3,则值为 00001000;
        bitmap[byteIndex] |= (1 << bitIndex);
    }

    public boolean exist(int value) {
   
        if (value < 0 || value > size) {
   
            throw new IllegalArgumentException("Value out of range");
        }
        //等价 value / 8 确定在数组的下标
        int byteIndex = value >> 3;
        //等价 value % 8 确定在byte元素中的下标
        int bitIndex = value & 7;
        return (bitmap[byteIndex] & (1 << bitIndex)) != 0;
    }

}

位图核心原理:

  • 使用 byte 数组,每个 byte 有 8 位,可以存储 8 个布尔值(是否存在)。
  • 对于整数值 value,计算它在数组中的位置:

    • byteIndex = value / 8:找到它属于哪个字节。
    • bitIndex = value % 8:找到字节中的哪一位。
  • 利用位操作设置或检查相应位。
    put 方法:

  • 使用位操作 |= 将对应位设置为 1
    exist 方法:
  • 使用位操作 & 检查对应位是否为 1
    边界检查:
  • 如果 value 超出范围,会抛出 IllegalArgumentException

bitmap[byteIndex] |= (1 << bitIndex)解释说明:

  • |= 是位或赋值运算,作用是将对应位设置为 1,而其他位保持不变。
  • 位或操作的规则是:只要其中一位为 1,结果就是 1
  • 举例:
    • 假设 bitmap[byteIndex] = 00000010(二进制)。
    • 如果 bitIndex = 3,那么 1 << 3 = 00001000
    • 位或操作:00000010 | 00001000 = 00001010
  • 最终的效果是,bitmap[byteIndex]bitIndex 位被置为 1,其余位保持原样。

后续

位图的理解暂时先写代码实现,后面还有根据位图做海量数据去重,以及JDK里BitSet的具体源码实现内容,有时间的时候再写写。

相关文章
|
存储 NoSQL Java
Java中使用redis的bitMap实现签到功能
这个实现示例提供了一种灵活、高效的方式,展示了如何使用Redis来解决现实中的问题。
584 2
|
存储 Java
Java中利用BitMap位图实现海量级数据去重
Java中利用BitMap位图实现海量级数据去重
|
存储 缓存 前端开发
【Java项目】bitmap实现B站点赞超过500取消最早的点赞记录的实现思路
【Java项目】bitmap实现B站点赞超过500取消最早的点赞记录的实现思路
386 0
|
缓存 前端开发 Java
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@358df999
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@358df999
|
Java 大数据 索引
Java中Bitmap的实现
说bitmap之前,我们要明白数字在内存中的表示,如果说byte用8个二进制位表示,即可以表示个数,每个byte占8位,即每个byte占8行,在内存中这样形象的表示: 而bitmap结构,充分利用了每一行所有的位数,它将每个位置作为一个数,那么一行就可以模拟表示出8个数。
3588 0
|
Java Android开发
Android/Java网络加载框架Retrofit(二)load bitmap into ListView
Android/Java网络加载框架Retrofit(二)load bitmap into ListView package zhangphil.
1027 0
|
前端开发 Android开发 机器学习/深度学习
java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap.
java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap. 异常原因分析:Canvas绘制bitmap需要的内存太大了,OOM了,直接就crash了。
7545 0
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
161 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
180 1