欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java位圖Bitmap從入門到實戰(zhàn)應(yīng)用詳解

 更新時間:2025年09月11日 08:30:13   作者:碼里看花?  
位圖(Bitmap)作為位運算的經(jīng)典應(yīng)用之一,通過巧妙地利用二進制位來表示數(shù)據(jù)的存在性或狀態(tài),實現(xiàn)了對大規(guī)模數(shù)據(jù)的高效存儲與處理,這篇文章主要介紹了Java位圖Bitmap從入門到實戰(zhàn)應(yīng)用的相關(guān)資料,需要的朋友可以參考下

導(dǎo)語:

位圖(Bitmap)是一種高效存儲和操作大量布爾值的數(shù)據(jù)結(jié)構(gòu)。本文將從基礎(chǔ)概念講起,逐步深入位圖的原理、應(yīng)用場景及Java實現(xiàn),助你輕松掌握這一高頻面試知識點。

一、什么是位圖?

位圖(Bitmap) 是一種利用二進制位(0或1)來存儲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。每個二進制位代表一個狀態(tài),常用于高效處理存在性判斷、去重、簽到統(tǒng)計等場景。

傳統(tǒng)方案 vs 位圖

  • 傳統(tǒng)方案:使用boolean數(shù)組存儲數(shù)據(jù),每個元素占1字節(jié)(8位)。

  • 位圖方案:每個元素僅占1位,空間利用率提升8倍!

示例:存儲1000萬個用戶的簽到狀態(tài)

  • boolean[]需要約10MB(10000000 / 1024 / 1024 ≈ 9.54MB)

  • 位圖僅需約1.25MB(10000000 / 8 / 1024 / 1024 ≈ 1.19MB)

二、位圖核心原理

1. 存儲結(jié)構(gòu)

  • 使用連續(xù)的內(nèi)存塊(如int[]long[]數(shù)組)存儲位數(shù)據(jù)。

  • 計算位置:確定元素在數(shù)組中的索引和偏移量。

    • 索引元素值 / 32(int占32位)

    • 偏移元素值 % 32

2. 核心操作

  • 設(shè)置位:將指定位置為1

  • 清除位:將指定位置為0

  • 查詢位:判斷指定位置是否為1

三、位圖應(yīng)用場景

1. 用戶簽到統(tǒng)計

  • 用位圖的每一位代表用戶某天是否簽到。

  • 每月簽到僅需31位,全年僅需365位。

2. 數(shù)據(jù)去重

  • 快速判斷元素是否存在,避免重復(fù)插入。

3. 布隆過濾器

  • 位圖是布隆過濾器實現(xiàn)的基礎(chǔ)結(jié)構(gòu),用于高效判斷元素可能存在絕對不存在

四、Java位圖實現(xiàn)

1. 使用BitSet類

Java內(nèi)置的BitSet類提供了位圖操作API。

import java.util.BitSet;

public class BitSetDemo {
    public static void main(String[] args) {
        BitSet bitmap = new BitSet(100); // 初始化100位的位圖
        
        // 設(shè)置第5位為1(簽到)
        bitmap.set(5);
        
        // 檢查第5位是否為1
        System.out.println("第5天是否簽到:" + bitmap.get(5)); // true
        
        // 清除第5位
        bitmap.clear(5);
        System.out.println("清除后:" + bitmap.get(5)); // false
    }
}

2. 手動實現(xiàn)位圖

通過int[]數(shù)組和位運算手動實現(xiàn)位圖:

public class CustomBitmap {
    private int[] bits; // 存儲位數(shù)據(jù)
    
    public CustomBitmap(int capacity) {
        // 計算需要多少個int來存儲capacity位
        bits = new int[(capacity >> 5) + 1]; // capacity/32 +1
    }
    
    // 設(shè)置位
    public void set(int pos) {
        int index = pos >> 5;       // 計算數(shù)組索引(等價于pos/32)
        int offset = pos & 0x1F;    // 計算偏移量(等價于pos%32)
        bits[index] |= (1 << offset); // 將指定位置1
    }
    
    // 清除位
    public void clear(int pos) {
        int index = pos >> 5;
        int offset = pos & 0x1F;
        bits[index] &= ~(1 << offset); // 將指定位清0
    }
    
    // 查詢位
    public boolean get(int pos) {
        int index = pos >> 5;
        int offset = pos & 0x1F;
        return (bits[index] & (1 << offset)) != 0;
    }

    public static void main(String[] args) {
        CustomBitmap bitmap = new CustomBitmap(100);
        bitmap.set(10); // 設(shè)置第10位
        System.out.println("第10位狀態(tài):" + bitmap.get(10)); // true
        bitmap.clear(10);
        System.out.println("清除后:" + bitmap.get(10)); // false
    }
}

五、注意事項與優(yōu)化

1. 稀疏數(shù)據(jù)處理

  • 當(dāng)數(shù)據(jù)非常稀疏時(如存儲1和1,000,000兩個值),位圖可能浪費空間。

  • 解決方案:使用壓縮位圖(如Roaring Bitmap)。

2. 線程安全

  • BitSet非線程安全!多線程環(huán)境下需使用Collections.synchronized包裝或自定義鎖。

3. 動態(tài)擴容

  • BitSet自動擴容,手動實現(xiàn)的位圖需處理數(shù)組擴容邏輯。

六、總結(jié)

位圖通過將每個元素壓縮到1位,大幅節(jié)省存儲空間,尤其適合處理海量布爾值場景。合理使用位圖,可顯著提升程序性能。但需根據(jù)數(shù)據(jù)分布選擇合適方案,避免空間浪費。

到此這篇關(guān)于Java位圖Bitmap從入門到實戰(zhàn)應(yīng)用的文章就介紹到這了,更多相關(guān)Java位圖Bitmap詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java棋類游戲?qū)嵺`之單機版五子棋

    Java棋類游戲?qū)嵺`之單機版五子棋

    這篇文章主要為大家詳細介紹了Java棋類游戲中的五子棋實現(xiàn)方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • springboot利用easypoi實現(xiàn)簡單導(dǎo)出功能

    springboot利用easypoi實現(xiàn)簡單導(dǎo)出功能

    本文介紹了如何使用Spring Boot和EasyPoi庫實現(xiàn)Excel文件的導(dǎo)出功能,EasyPoi是一個簡化Excel和Word操作的工具,通過簡單的配置和代碼,可以輕松地將Java對象導(dǎo)出為Excel文件,并且支持圖片導(dǎo)出等功能,感興趣的朋友一起看看吧
    2024-12-12
  • 解決Springboot get請求是參數(shù)過長的情況

    解決Springboot get請求是參數(shù)過長的情況

    這篇文章主要介紹了解決Springboot get請求是參數(shù)過長的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 輕松了解java中Caffeine高性能緩存庫

    輕松了解java中Caffeine高性能緩存庫

    本文我們將學(xué)習(xí)了解到用于Java的高性能緩存庫Caffeine,其使用Window TinyLfu清理策略,提供最佳的命中率
    2021-08-08
  • Mybatis update數(shù)據(jù)庫死鎖之獲取數(shù)據(jù)庫連接池等待

    Mybatis update數(shù)據(jù)庫死鎖之獲取數(shù)據(jù)庫連接池等待

    這篇文章主要介紹了Mybatis update數(shù)據(jù)庫死鎖之獲取數(shù)據(jù)庫連接池等待的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 詳解配置類為什么要添加@Configuration注解

    詳解配置類為什么要添加@Configuration注解

    這篇文章主要介紹了詳解配置類為什么要添加@Configuration注解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • MyBatis如何調(diào)用存儲過程與存儲函數(shù)

    MyBatis如何調(diào)用存儲過程與存儲函數(shù)

    這篇文章主要介紹了MyBatis如何調(diào)用存儲過程與存儲函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Bean 中的生命周期和獲取方式詳解

    Spring Bean 中的生命周期和獲取方式詳解

    Bean的加載和獲取過程涉及配置文件解析、資源加載、XML解析和BeanDefinition注冊等步驟,本文給大家介紹Spring Bean 的生命周期和獲取方式,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • mybatis if test 不為空字符串或null的解決

    mybatis if test 不為空字符串或null的解決

    這篇文章主要介紹了mybatis if test 不為空字符串或null的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • springmvc處理響應(yīng)數(shù)據(jù)的解析

    springmvc處理響應(yīng)數(shù)據(jù)的解析

    今天小編就為大家分享一篇關(guān)于springmvc處理響應(yīng)數(shù)據(jù)的解析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論