首頁 > 軟體

Java BitMap原始碼仿寫實現

2022-12-23 14:01:17

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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com