Java BitMap源码仿写实现

 更新时间:2022年12月22日 14:16:14   作者:洋圏外の彼女  
这篇文章主要介绍了Java BitMap源码仿写实现,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的

bitmap的作用:

用来校验海量数字中某一个数字有没有出现过,海量数据中某一个数据有没有出现过

做一个长的比特数组,比特数组就会出现索引(0n),所有0n之间的数,比如123,就把所有比特数组中索引为123的位置,由0变为1;看这个数有没有出现在比特数组中,看是0还是1;0没有出现过,1出现过;

(getIndex()方法)byte数组中每一个都代表八位;做value>>3只是确定了0,1,2,3,4,5的位置,但是不知道在里边的空里是多少;

getPosition()方法:决定了在后面1~8中的哪个位置

private int getPosition(int value){
   // return value%8;
    return value & 0x07;
}

byte[] bits = new byte[2];

比如说:添加13

13/8 = 1;确定了索引为1的一行的内容

13>>3; 13的二进制数是:1101 - - - > 0001

13%8 = 5;确定了是在此行的第五个位置

13 & 0x07

13 = 1101

0x07 = 0111

与操作= 0101

所以说13的位置 bits[13>>3] | 1<<(13&0x07)

1<<(13&0x07) = 1 << 5 = 0001 << = 00100000

假如说原来就是0 :00000000

或操作:00100000

package com.BitMap;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class MyBitMap {
    private byte[] bits;
    //byte数组中每一个数字都要代表八位
    public static final int DEFAULT_CAPACITY = 1<<10;//最大容量是1左移10位
    public MyBitMap(){
        this.bits = new byte[DEFAULT_CAPACITY];
        //System.out.println(bits.length);//输出一下1左移10位的数字是多少
    }
    public static void main(String[] args) {
        MyBitMap map = new MyBitMap();
        Set<Integer> set = new HashSet<Integer>();
        Random random = new Random();
        for (int i = 0 ;i<800;i++){
            int i1 = random.nextInt(DEFAULT_CAPACITY);
            map.add(i1);
            set.add(i1);
        }
        for (int i = 100; i < 300; i++) {
            boolean contains = map.contains(i);
            if (contains){
                //用已知的set 来确定这个Map写的没问题
                if (set.contains(i)){
                    System.out.print(i + " is contains by set!!! ");
                }
                System.out.println(i + " is contains!!! ");
            }
            else {
                if (!set.contains(i)){
                    System.out.print((i + " is not contains by set !!!"));
                }
                System.out.println(i + " is not contains!");
            }
        }
    }
    public void add(int value){
        //找到value值在byte数组中的位置是在哪里
        int index = getIndex(value);
        //求余
        int position = getPosition(value);
        bits[index] |=1<<position;
    }
    public boolean contains(int value){
        int index = getIndex(value);
        int position = getPosition(value);
        return (bits[index] & 1<<position) != 0;
    }
    private int getPosition(int value){
       // return value%8;
        return value & 0x07;
    }
    //找到value值当前所在数组中的位置
    private int getIndex(int value){
        // return value/8;
        return value>>3;
        //byte数组每个数字代表八位,除以8就可以得到数组里边的位置
    }
}

到此这篇关于Java BitMap源码仿写实现的文章就介绍到这了,更多相关Java BitMap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现XML格式与JSON格式互相转换的方法

    Java实现XML格式与JSON格式互相转换的方法

    这篇文章主要介绍了Java实现XML格式与JSON格式互相转换的方法,方法通过实例代码给大家介绍的非常详细,选择使用哪种格式通常取决于项目的需求和上下文,所以格式转换就成了我们必备的技能,具体实现代码跟随小编一起看看吧
    2023-10-10
  • IDEA中Maven报错Cannot resolve xxx的解决方法汇总(亲测有效)

    IDEA中Maven报错Cannot resolve xxx的解决方法汇总(亲测有效)

    在IDEA中的pom文件中添加了依赖,并且正确加载了相应依赖,pom文件没有报红,看起来像是把所有依赖库全部加载进来了,但是代码中使用依赖的类库使报红,本文给大家介绍了IDEA中Maven报错Cannot resolve xxx的解决方法汇总,需要的朋友可以参考下
    2024-06-06
  • 详解Spring Boot 目录文件结构

    详解Spring Boot 目录文件结构

    这篇文章主要介绍了Spring Boot 目录文件结构的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Java文件(io)编程_基于File类的基本用法(必看篇)

    Java文件(io)编程_基于File类的基本用法(必看篇)

    下面小编就为大家带来一篇Java文件(io)编程_基于File类的基本用法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 使用Java发送邮件到QQ邮箱的完整指南

    使用Java发送邮件到QQ邮箱的完整指南

    在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程序,实现发送邮件到QQ邮箱的功能,需要的朋友可以参考下
    2025-03-03
  • 浅析Spring的事务实现原理

    浅析Spring的事务实现原理

    这篇文章主要为大家详细介绍了Spring中事务实现的原理,文中的示例代码讲解详细,对我们学习Spring有一定的帮助,需要的可以参考一下
    2022-11-11
  • 详解Java中super的几种用法并与this的区别

    详解Java中super的几种用法并与this的区别

    这篇文章主要介绍了Java中super的几种用法并与this的区别,有需要的朋友可以参考一下
    2013-12-12
  • 自定义一个异常类模板的简单实例

    自定义一个异常类模板的简单实例

    下面小编就为大家带来一篇自定义一个异常类模板的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • java中Optional的使用详细解析

    java中Optional的使用详细解析

    这篇文章主要介绍了java新特性之Optional的详细解析,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Kotlin lateinit与by lazy案例详解

    Kotlin lateinit与by lazy案例详解

    这篇文章主要介绍了Kotlin lateinit与by lazy案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09

最新评论