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

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

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

導語:

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

一、什么是位圖?

位圖(Bitmap) 是一種利用二進制位(0或1)來存儲數(shù)據(jù)的數(shù)據(jù)結構。每個二進制位代表一個狀態(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. 存儲結構

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

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

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

    • 偏移元素值 % 32

2. 核心操作

  • 設置位:將指定位置為1

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

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

三、位圖應用場景

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

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

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

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

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

3. 布隆過濾器

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

四、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位的位圖
        
        // 設置第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
    }
    
    // 設置位
    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); // 設置第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ù)處理

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

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

2. 線程安全

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

3. 動態(tài)擴容

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

六、總結

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

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

相關文章

  • IntelliJ IDEA 熱部署插件JRebel的使用

    IntelliJ IDEA 熱部署插件JRebel的使用

    這篇文章主要介紹了IntelliJ IDEA 熱部署插件JRebel的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • mybatis-plus批量更新太慢該如何解決詳解

    mybatis-plus批量更新太慢該如何解決詳解

    這篇文章主要給大家介紹了關于mybatis-plus批量更新太慢該如何解決的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-03-03
  • mybatis輸入映射和輸出映射實例詳解

    mybatis輸入映射和輸出映射實例詳解

    這篇文章主要介紹了mybatis輸入映射和輸出映射,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • SpringBoot Web工程同時啟動多個HTTP端口的方法

    SpringBoot Web工程同時啟動多個HTTP端口的方法

    本文介紹了在SpringbootWeb工程中如何配置多個HTTP端口,分別以Tomcat、Jetty和Undertow為例,通過修改配置文件和編寫配置類實現(xiàn)多端口啟動,并提供了詳細的代碼供讀者參考,需要的朋友可以參考下
    2026-04-04
  • SpringBoot自動化配置原理和自定義starter方式

    SpringBoot自動化配置原理和自定義starter方式

    SpringBoot自動配置機制主要通過-spring-boot-starter和-spring-boot-autoconfigure創(chuàng)建自定義starter模塊,使用EnableAutoConfiguration注解加載自動配置類,啟動類通過創(chuàng)建Spring容器完成自動化裝配
    2026-04-04
  • Java如何判斷一個字符串是否包含某個字符串

    Java如何判斷一個字符串是否包含某個字符串

    這篇文章主要給大家介紹了關于Java如何判斷一個字符串是否包含某個字符串的相關資料,在實際編程中,經(jīng)常需要判斷一個字符串中是否包含某個子串,需要的朋友可以參考下
    2023-07-07
  • ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例

    ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例

    這篇文章主要為大家介紹了ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Java編程子類能否重寫父類的靜態(tài)方法探索

    Java編程子類能否重寫父類的靜態(tài)方法探索

    關于子類能否重寫父類的靜態(tài)方法,對像我這種初級的編程愛好者來說仍是值得討論的一件事,下面我們通過具體實例,對此問題進行簡單的探索。
    2017-10-10
  • Java中兩種拋出異常的方式示例詳解

    Java中兩種拋出異常的方式示例詳解

    在Java中有兩種拋出異常的方式,一種是throw,直接拋出異常,另一種是throws,間接拋出異常,本文給大家詳細說明java中兩種拋出異常的方式,感興趣的朋友一起看看吧
    2023-08-08
  • Java一維數(shù)組和二維數(shù)組元素默認初始化值的判斷方式

    Java一維數(shù)組和二維數(shù)組元素默認初始化值的判斷方式

    這篇文章主要介紹了Java一維數(shù)組和二維數(shù)組元素默認初始化值的判斷方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

宁都县| 甘德县| 闸北区| 江油市| 青阳县| 威远县| 漠河县| 湖北省| 财经| 中西区| 商城县| 柳河县| 揭阳市| 修武县| 都匀市| 南开区| 陆丰市| 仙居县| 中宁县| 景宁| 顺平县| 钦州市| 弥渡县| 徐州市| 临邑县| 万载县| 方城县| 吉安县| 漳州市| 沛县| 依安县| 祁阳县| 东安县| 胶州市| 诸暨市| 托克托县| 新沂市| 汉沽区| 区。| 松潘县| 浠水县|