最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中BitMap(位圖)hutool版、IntMap、LongMap示例詳解

 更新時間:2024年12月27日 10:26:34   作者:qq_41369135  
這篇文章主要給大家介紹了關于Java中BitMap(位圖)hutool版、IntMap、LongMap的相關資料,通過位運算高效存儲和檢索整數,相比于傳統(tǒng)數組,它們在內存占用和性能上都有顯著優(yōu)勢,需要的朋友可以參考下

一、引入依賴

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.5.1</version>
</dependency>

二、源碼

BitMap (interface )

package cn.hutool.bloomfilter.bitMap;

public interface BitMap {
    int MACHINE32 = 32;
    int MACHINE64 = 64;

    void add(long var1);

    boolean contains(long var1);

    void remove(long var1);
}

IntMap (class)

package cn.hutool.bloomfilter.bitMap;

import java.io.Serializable;

public class IntMap implements BitMap, Serializable {
    private static final long serialVersionUID = 1L;
    private final int[] ints;

    public IntMap() {
        this.ints = new int[93750000];
    }

    public IntMap(int size) {
        this.ints = new int[size];
    }

    public void add(long i) {
        int r = (int)(i / 32L);
        int c = (int)(i % 32L);
        this.ints[r] |= 1 << c;
    }

    public boolean contains(long i) {
        int r = (int)(i / 32L);
        int c = (int)(i % 32L);
        return (this.ints[r] >>> c & 1) == 1;
    }

    public void remove(long i) {
        int r = (int)(i / 32L);
        int c = (int)(i % 32L);
        int[] var10000 = this.ints;
        var10000[r] &= ~(1 << c);
    }
}

LongMap(class) 

package cn.hutool.bloomfilter.bitMap;

import java.io.Serializable;

public class LongMap implements BitMap, Serializable {
    private static final long serialVersionUID = 1L;
    private final long[] longs;

    public LongMap() {
        this.longs = new long[93750000];
    }

    public LongMap(int size) {
        this.longs = new long[size];
    }

    public void add(long i) {
        int r = (int)(i / 64L);
        long c = i % 64L;
        this.longs[r] |= 1L << (int)c;
    }

    public boolean contains(long i) {
        int r = (int)(i / 64L);
        long c = i % 64L;
        return (this.longs[r] >>> (int)c & 1L) == 1L;
    }

    public void remove(long i) {
        int r = (int)(i / 64L);
        long c = i % 64L;
        long[] var10000 = this.longs;
        var10000[r] &= ~(1L << (int)c);
    }
}

三、以下純屬自學(自己測試,有問題請幫忙指出)

四、BigMap原理

原來如果我們要存儲1,2,3,4四個整數,就需要new一個 長度為4的數組存儲,如new int[3],占內存就是4x4=16byte。而現在入宮hutool的 IntMap,只需要 new IntMap[1]就夠了,占內存1x4=4byte。

而且new IntMap[1]可以存儲0-31這32個整數。用傳統(tǒng)方法得new int[31],占內存就是32x4=128byte。他們兩個的內存占比就是32:1(原始:IntMap)

1.IntMap是怎么存儲的?add(long i)方法

1.1 我們先new IntMap[1]。int=4byte=32bit。所以得到如下32位二進制 。

00000000 00000000 00000000 00000000

我們都知道二進制只有0和1,在這里可以這么理解,如下面這樣,代表存入這個0、7、31三個整數。簡而言之,當我們只new 了1字節(jié)(32bit)大小的空間, 只要我們存入0-31內的某個數字,二進制對應位就會被置為1

10000000 00000000 00000000 10000001

如:

1.2 查看add方法解析

可以發(fā)現他做了以下操作。比如我們要存儲 7 這個數字

r 代表7存放在index為0 tmp[0] 里

c 代表 7 該存放在tmp[0] 中32bit位哪個位置

著重 講 this.ints[r] |= 1 << c (有三步操作),源碼是  1左移7位后,第8個bit位從0變?yōu)?,如下:

初始 1 的二進制:

00000000 00000000 00000000 00000001

1.  1 左移7位后:

00000000 00000000 00000000 10000000

2.  最后與 ints[0] 進行或運算后得到,如下:

00000000 00000000 00000000 10000000

00000000 00000000 00000000 00000000  ints[0]

結果 :

00000000 00000000 00000000 10000000

3.  第三步,給 ints[0] 賦值 (把或運算的值付給ints[0])

注意:為什么要進行或運算  ,是因為要保留前面add得值。如此時我們已經add了 7 ,此時ints[0]為:

ints[0] = 00000000 00000000 00000000 10000000

我們再往里面 add一個 9 。程序又執(zhí)行到或運算 那一步

00000000 00000000 00000010 00000000   新的 add  9  的值

00000000 00000000 00000000 10000000  ints[0]  原來add 7 的值

或運算后,7跟9的值都保存起了。如下:

ints[0] = 00000000 00000000 00000010 10000000

個人理解:

接上面第一步 左移7位 說,為什么要從1左移 c 位,我的理解:它的設計思想默認第一個bit位都放余數為0的數,如tmp[0]中的整數0,tmp[1]中的整數 32。其余數 位置都要+1bit位。從代碼編寫來說就變成 1<<c

2.contains(long i)方法與remove(long i)方法自己可以 根據以上去驗證理解

五、同理,LongMap也是類似的思想

到此這篇關于Java中BitMap(位圖)hutool版、IntMap、LongMap的文章就介紹到這了,更多相關Java BitMap、IntMap、LongMap內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot?AspectJ切面配合自定義注解實現權限校驗的示例詳解

    SpringBoot?AspectJ切面配合自定義注解實現權限校驗的示例詳解

    本文章介紹了如何通過創(chuàng)建自定義的權限校驗注解,配合AspectJ切面攔截注解實現權限校驗,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-09-09
  • 從面試中的問題分析ThreadLocal

    從面試中的問題分析ThreadLocal

    這篇文章主要介紹了從面試中的問題分析ThreadLocal,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來一起學習一下吧
    2019-06-06
  • SpringBoot如何統(tǒng)一配置bean的別名

    SpringBoot如何統(tǒng)一配置bean的別名

    這篇文章主要介紹了SpringBoot如何統(tǒng)一配置bean的別名,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 深入探討Java?SPI機制及其應用場景

    深入探討Java?SPI機制及其應用場景

    本文深入介紹了Java?SPI機制的原理和實現方式,以及在Java中如何使用SPI實現可插拔的組件化架構,包括示例代碼和應用場景分析,幫助讀者更好地理解和應用該機制
    2023-04-04
  • TOMCAT內存溢出及大小調整的實現方法

    TOMCAT內存溢出及大小調整的實現方法

    下面小編就為大家?guī)硪黄猅OMCAT內存溢出及大小調整的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • SpringBoot動態(tài)實現數據脫敏的實戰(zhàn)指南

    SpringBoot動態(tài)實現數據脫敏的實戰(zhàn)指南

    這篇文章主要為大家詳細介紹了SpringBoot動態(tài)實現數據脫敏的五種方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-12-12
  • @PathVariable 如何自動填充入實例對象中

    @PathVariable 如何自動填充入實例對象中

    這篇文章主要介紹了@PathVariable 實現自動填充入實例對象中的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java解析json復雜數據的方法詳解

    java解析json復雜數據的方法詳解

    這篇文章主要為大家詳細介紹了java解析json復雜數據的兩種常用方法,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的小伙伴可以了解下
    2024-01-01
  • Java 實現Excel文檔添加超鏈接的代碼

    Java 實現Excel文檔添加超鏈接的代碼

    超鏈接即內容鏈接,通過給特定對象設置超鏈接,可實現載體與特定網頁、文件、郵件、網絡等的鏈接,點擊鏈接載體可打開鏈接目標,在文檔處理中是一種比較常用的功能,本文將介紹通過Java程序給Excel文檔添加超鏈接的方法,感興趣的朋友一起看看吧
    2020-02-02
  • java8學習教程之函數引用的使用方法

    java8學習教程之函數引用的使用方法

    這篇文章主要給大家介紹了關于java8學習教程之函數引用的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習下吧。
    2017-09-09

最新評論

栾川县| 方正县| 东安县| 伊金霍洛旗| 庆元县| 阿勒泰市| 安顺市| 武邑县| 始兴县| 平昌县| 科尔| 玉龙| 新巴尔虎右旗| 安泽县| 西峡县| 嘉禾县| 且末县| 临潭县| 扎赉特旗| 城口县| 丹棱县| 平塘县| 县级市| 灵台县| 湟源县| 海南省| 永州市| 平顶山市| 焦作市| 瑞安市| 荣成市| 天台县| 玉龙| 合江县| 射洪县| 定陶县| 潜山县| 廉江市| 成安县| 八宿县| 台州市|