ArrayMap和HashMap的記憶體占用的區別

2021-08-28 16:36:35 字數 2517 閱讀 9844

hashmap 原理:

hashmap 是基於雜湊表的 map 介面實現的,內部儲存的結構是使用雜湊表的拉鍊結構(陣列+鍊錶)的方式,如下圖所示

hashmap中預設的儲存大小就是乙個容量為16的陣列,所以當我們建立出乙個hashmap物件時,即使裡面沒有任何元素,也要分別一塊記憶體空間給它,而且,

我們再不斷的向hashmap裡put資料時,當達到一定的容量限制時(這個容量滿足這樣的乙個關係時候將會擴容:hashmap中的資料量》容量*載入因子,而

hashmap中預設的載入因子是0.75),hashmap的空間將會擴大,而且擴大後新的空間大約是原來的2倍,只要一滿足擴容條件,hashmap的空間將會以2倍

的規律進行增大。假如我們有幾十萬、幾百萬條資料,那麼hashmap要儲存完這些資料將要不斷的擴容,在此過程中也需要不斷的做hash運算,這將對我們的

記憶體空間造成很大消耗和浪費。

用pixel手機做測試,儲存10萬條資料方法如下:

for (int i = 0; i <100000; i++) {

hashmap.put(i,"sunchao = "+i);

測試hashmap儲存10萬條資料得出的記憶體動態圖:

arraymap的工作原理:

為了解決hashmap佔記憶體的弊端,android提供了記憶體效率更高的arraymap。它內部使用兩個陣列進行工作,其中乙個陣列記錄

key換成hash值過後的順序列表,另外乙個陣列按key的順序記錄key-value值,如下圖所示

可以看出arraymap採用的是key-values對映資料結構。

arraymap中主要儲存的資料的是兩個資料

mhashs中儲存出的是每個key的hash值,並且在這些key的hash值在陣列當中是從小到大排序的。marray的陣列長度是mhashs的兩倍,每兩個元素分別

是key和value,這兩元素對應mhashs中的hash值。在我們使用put方法進行儲存資料的過程中,空間不夠時,會發生如下擴容

base_size = 4,先判斷osize值是否大於等於8,如果是則n=osize*1.5,否則就判斷是否大於等於4,是則n=8個,否則n=4個。

然後把老的陣列中的資料複製到了新的陣列當中如下

allocarrays和freearrays方法中,。這兩個方法的作用基本上就是當長度不夠用,我們需要廢棄掉老的陣列,使用新的陣列的時候,

把老的陣列(包含mhashes和marray)的資料新增到oarray當中,然後把oldarray賦值給mbasecache(4個長度),如果再有

新的arraymap建立陣列空間的時候,如果還是申請4個的空間,那麼優先使用快取下來的這個。

用pixel手機做測試,同樣儲存10萬條資料方法如下:

for (int i = 0; i <100000; i++) {

arraymap.put(i,"sunchao = "+i);

測試arraymap儲存10萬條資料得出的記憶體動態圖:

從中可以得出結論: 在儲存資料方面arraymap確實要比hashmap消耗的記憶體小。hashmap初始值16個長度,每次擴容的時候,

直接申請雙倍的陣列空間。arraymap每次擴容的時候,如果size長度大於8時申請size*1.5個長度,大於4小於8時申請8個,小於

4時申請4個。arraymap其實是申請了更少的記憶體空間,但是擴容的頻率會更高,並且arraymap採用了一種獨特的方式,能夠重複

的利用因為資料擴容而遺留下來的陣列空間,而hashmap沒有這種設計。

ConcurrentMap和HashMap的區別

類 hashset 所有已實現的介面 serializable,cloneable,iterable,collection,set 此類實現 set 介面,由雜湊表 實際上是乙個 hashmap 例項 支援。它不保證 set 的迭代順序 特別是它不保證該順序恆久不變。此類允許使用 null 元素。此...

ConcurrentMap和HashMap的區別

類 hashset 所有已實現的介面 serializable,cloneable,iterable,collection,set 此類實現 set 介面,由雜湊表 實際上是乙個 hashmap 例項 支援。它不保證 set 的迭代順序 特別是它不保證該順序恆久不變。此類允許使用 null 元素。此...

SparseArray和ArrayMap的內部實現

1 sparsearray 上面這段話來自sparsearray類的宣告,重點關注一下 與使用hashmap將integers對映到objects相比,它的記憶體效率更高,因為它避免了自動裝箱鍵,並且其資料結構不依賴於每個對映的額外條目物件。這也是sparsearray的優點 sparsearray...