HashMap,SparseArray,ArrayMap三者之間
Android為我們提供了比HashMap記憶體效率更高的鍵值對資料結構SparseArray和ArrayMap,今天來說說為什麼要使用SparseArray和ArrayMap來替代HashMap.
HashMap的資料結構特點是維護一個預設大小為16的陣列用於儲存,這個每個陣列存放這個
class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; }
注意Node<K,V> next; 意味著它並不單單只是存放一個物件,它存放的是一個連結串列。
我們通過計算key的hash值,然後用hash值除以陣列長度取餘數,通過這個餘數決定這個Node的在陣列中的存放位置。
在HashMap的建構函式中有一個loadFactor.
public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted }
/** * The load factor used when none specified in constructor. */ static final float DEFAULT_LOAD_FACTOR = 0.75f;
loadFactor = 0.75f的意思是當陣列空間佔用超過75%的時候會進行重新雜湊擴充。
HashMap的實現原理效率其實並不高原因如下:
1,有一個初始化容量,在沒有儲存資料的情況下仍然佔用記憶體
2,達到一定容量就需要進行擴容,擴容過程浪費記憶體
3,它的遍歷是通過遍歷Node[]陣列來得到對應元素的,資料量很大的時候會比較慢.
所以在Android平臺上面出現了SparseArray,ArrayMap用來替代HashMap, 它在小資料容量下面效率比HashMap高,原因是
1, SparseArray中key為int,避免自動裝箱為Integer.(ArrayMap的key可以為任何型別)
2, 內部使用陣列儲存key和value(陣列的遍歷比連結串列快)
3, 內部使用二分法存取資料(比HashMap遍歷Node[]陣列快)
所以
【附錄】

資料圖
需要資料的朋友可以加入Android架構交流QQ群聊:513088520
點選連結加入群聊【Android移動架構總群】: 加入群聊
獲取免費學習視訊,學習大綱另外還有像高階UI、效能優化、架構師課程、NDK、混合式開發(ReactNative+Weex)等Android高階開發資料免費分享。