ArrayMap和HashMap區別

什麼是Map?

Map的三個特色html

1.包含鍵值對 
2.鍵惟一 
3.鍵對應的值惟一算法

一:hash

什麼是Hash

Hash,也能夠稱爲「散列」,就是把任意長度的輸入,經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出(也就是多對一的關係)。數組

HashMap

HashMap內部是使用一個默認容量爲16的數組來存儲數據的,而數組中每個元素卻又是一個鏈表的頭結點,因此,更準確的來講,HashMap內部存儲結構是使用哈希表的拉鍊結構(數組+鏈表),這種存儲數據的方法叫作拉鍊法 。如圖: 數據結構

 

 

且每個結點都是Entry類型,那麼Entry是什麼呢?咱們來看看HashMap中Entry的屬性:性能

1 final K key;  
2 final V value;  
3 final int hash;  
4 HashMapEntry<K, V> next;  

從中咱們得知Entry存儲的內容有key、value、hash值、和next下一個Entry,那麼,這些Entry數據是按什麼規則進行存儲的呢?就是經過計算元素key的hash值,而後對HashMap中數組長度取餘獲得該元素存儲的位置,計算公式爲hash(key)%len,好比:假設hash(14)=14,hash(30)=30,hash(46)=46 咱們對len取餘,獲得hash(14)%16=14,hash(30)%16=14,hash(46)%16=14。因此hash值爲14的這個元素存儲在數組下標爲14的位置。優化

 

從中能夠看出,若是有多個元素key的hash值相同的話,後一個元素並不會覆蓋上一個元素,而是採起鏈表的方式,把以後加進來的元素加入鏈表末尾,從而解決了hash衝突的問題,由此咱們知道HashMap中處理hash衝突的方法是鏈地址法。spa

在此補充一個知識點,處理hash衝突的方法有如下幾種:設計

  1. 開放地址法
  2. 再哈希法
  3. 鏈地址法
  4. 創建公共溢出區

講到這裏,重點來了,咱們知道HashMap中默認的存儲大小就是一個容量爲16的數組,因此當咱們建立出一個HashMap對象時,即便裏面沒有任何元素,也要分別一塊內存空間給它,並且,咱們再不斷的向HashMap裏put數據時,當達到必定的容量限制時(這個容量知足這樣的一個關係時候將會擴容:HashMap中的數據量>容量*加載因子,而HashMap中默認的加載因子是0.75),HashMap的空間將會擴大,並且擴大後新的空間必定是原來的2倍,咱們能夠看put()方法中有這樣的一行代碼:3d

1 int newCapacity = oldCapacity * 2;

因此,只要一知足擴容條件,HashMap的空間將會以2倍的規律進行增大。假如咱們有幾十萬、幾百萬條數據,那麼HashMap要存儲完這些數據將要不斷的擴容,並且在此過程當中也須要不斷的作hash運算,這將對咱們的內存空間形成很大消耗和浪費,並且HashMap獲取數據是經過遍歷Entry[]數組來獲得對應的元素,在數據量很大時候會比較慢,因此在Android中,HashMap是比較費內存的。code

因此咱們在一些狀況下可使用SparseArray和ArrayMap來代替HashMap。

 

 

二:ArrayMap

ArrayMap是一個<key,value>映射的數據結構,它設計上更多的是考慮內存的優化,內部是使用兩個數組進行數據存儲,一個數組記錄key的hash值,另一個數組記錄Value值,它和SparseArray同樣,也會對key使用二分法進行從小到大排序,在添加、刪除、查找數據的時候都是先使用二分查找法獲得相應的index,而後經過index來進行添加、查找、刪除等操做,因此,應用場景和SparseArray的同樣,若是在數據量比較大的狀況下,那麼它的性能將退化至少50%。

ArrayMap方法:

public V put(K key, V value)

public V get(Objectkey)

public V remove(Objectkey)

public K keyAt(int index) 

public V valueAt(int index)

 

ArrayMap應用場景

  • 1.數據量不大,最好在千級之內
  • 2.數據結構類型爲Map類型

 

歡迎你們關注公衆號,不定時乾貨,只作有價值的輸出

做者:Dawnzhang 
出處:https://www.cnblogs.com/clwydjgs/版權:本文版權歸做者轉載:歡迎轉載,但未經做者贊成,必須保留此段聲明;必須在文章中給出原文鏈接;不然必究法律責任

相關文章
相關標籤/搜索