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的二進制數(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值當前所在數(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)文章
Springboot如何優(yōu)雅的關(guān)閉應用
這篇文章主要介紹了Springboot如何優(yōu)雅的關(guān)閉應用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08新版idea創(chuàng)建spring boot項目的詳細教程
這篇文章給大家介紹了新版idea創(chuàng)建spring boot項目的詳細教程,本教程對新手小白友好,若根據(jù)教程創(chuàng)建出現(xiàn)問題導致失敗可下載我提供的源碼,在文章最后,本教程較新,文中通過圖文給大家介紹的非常詳細,感興趣的朋友可以參考下2024-01-01MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus實現(xiàn)多表聯(lián)查的方法,MyBatis Plus是一款針對MyBatis框架的增強工具,它提供了很多方便的方法來實現(xiàn)多表聯(lián)查,需要的朋友可以參考下2023-07-07java 中Executor, ExecutorService 和 Executors 間的不同
這篇文章主要介紹了java 中Executor, ExecutorService 和 Executors 間的不同的相關(guān)資料,需要的朋友可以參考下2017-06-06Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實例代碼
這篇文章主要介紹了Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01Spring Boot使用FastJson解析JSON數(shù)據(jù)的方法
本篇文章主要介紹了Spring Boot使用FastJson解析JSON數(shù)據(jù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02MyBatis如何實現(xiàn)多表查詢(多對一、一對多)
這篇文章主要給大家介紹了關(guān)于MyBatis如何實現(xiàn)多表查詢(多對一、一對多)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05