Java?BitMap源碼仿寫實現(xiàn)
bitmap的作用:
用來校驗海量數(shù)字中某一個數(shù)字有沒有出現(xiàn)過,海量數(shù)據(jù)中某一個數(shù)據(jù)有沒有出現(xiàn)過
做一個長的比特數(shù)組,比特數(shù)組就會出現(xiàn)索引(0n),所有0n之間的數(shù),比如123,就把所有比特數(shù)組中索引為123的位置,由0變?yōu)?;看這個數(shù)有沒有出現(xiàn)在比特數(shù)組中,看是0還是1;0沒有出現(xiàn)過,1出現(xiàn)過;
(getIndex()方法)byte數(shù)組中每一個都代表八位;做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的一行的內(nèi)容
13>>3; 13的二進(jìn)制數(shù)是: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數(shù)組中每一個數(shù)字都要代表八位
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位的數(shù)字是多少
}
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數(shù)組中的位置是在哪里
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值當(dāng)前所在數(shù)組中的位置
private int getIndex(int value){
// return value/8;
return value>>3;
//byte數(shù)組每個數(shù)字代表八位,除以8就可以得到數(shù)組里邊的位置
}
}到此這篇關(guān)于Java BitMap源碼仿寫實現(xiàn)的文章就介紹到這了,更多相關(guān)Java BitMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法
這篇文章主要介紹了Java實現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法,方法通過實例代碼給大家介紹的非常詳細(xì),選擇使用哪種格式通常取決于項目的需求和上下文,所以格式轉(zhuǎn)換就成了我們必備的技能,具體實現(xiàn)代碼跟隨小編一起看看吧2023-10-10
IDEA中Maven報錯Cannot resolve xxx的解決方法匯總(親測有效)
在IDEA中的pom文件中添加了依賴,并且正確加載了相應(yīng)依賴,pom文件沒有報紅,看起來像是把所有依賴庫全部加載進(jìn)來了,但是代碼中使用依賴的類庫使報紅,本文給大家介紹了IDEA中Maven報錯Cannot resolve xxx的解決方法匯總,需要的朋友可以參考下2024-06-06
詳解Spring Boot 目錄文件結(jié)構(gòu)
這篇文章主要介紹了Spring Boot 目錄文件結(jié)構(gòu)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Java文件(io)編程_基于File類的基本用法(必看篇)
下面小編就為大家?guī)硪黄狫ava文件(io)編程_基于File類的基本用法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
詳解Java中super的幾種用法并與this的區(qū)別
這篇文章主要介紹了Java中super的幾種用法并與this的區(qū)別,有需要的朋友可以參考一下2013-12-12

