前言:
bitmap是壓縮空間的一個好方法。
byte -> 8 bits -->1字節 char -> 16 bit -->2字節 short -> 16 bits -->2字節 int -> 32 bits -->4字節 float -> 32 bits -->4字節 long -> 64 bits -->8字節
8bit = >1byte 1024btye=>1KB 1024KB =>1MB 1024MB =>1GB
問題引入:
試想現在有一個場景,如果現在需要實現,在一段時間內,會有10億的手機用戶登錄,現在有一個手機登錄,怎麼知道該手機是否已經登錄,並把內存壓縮到最小呢
如果使用int數組存儲的話大概要10億*4字節=400000000/1024KB= 3906250KB=3906250/1024MB=3814.697265625MB≈3.7GB
如果用hashmap的key-value存儲的話,還會更大。
而bitmap用的是數組的標誌位來表達該數是否存在。借用網圖,使用byte[i]座標來表達數字。
對於國內手機用戶,11位數,即最多19999999999,約算200億,200億*1/8/1024/1024/1024GB=2.3GB
因爲國內手機用戶都是以1開頭,若不算第一位約算100億,大約是1.15GB
倘若我們繼續優化只計算目前市場流行的幾種136,156...等開頭的能繼續節省不少的空間。
因此可以看到使用bitmap能夠節省大量的空間。
但是這種bitmap並不是沒有弱點:
1.數據碰撞,如果用bitmap存儲String類型的時候,有可能出現兩個String的int相同情況,這個時候可以使用布隆過濾器(bloom filter)。
2.數據稀疏,如果用bitmap就存儲幾個數據的時候,可以使用RoaringBitmap(高效壓縮位圖)