原文地址:https://blog.csdn.net/u010687392/article/details/47809295
HashMap:
1蚓耽、HashMap內(nèi)部使用一個(gè)默認(rèn)容量為16的數(shù)組來存儲數(shù)據(jù)杀赢。
2谜嫉、數(shù)組中的每一個(gè)元素又是另一個(gè)鏈表的頭結(jié)點(diǎn)。
3镶蹋、HashMap內(nèi)部存儲結(jié)構(gòu)采用哈希表的拉鏈結(jié)構(gòu)成艘,叫做拉鏈法。
4贺归、每一個(gè)節(jié)點(diǎn)->entry中包含的內(nèi)容:
final K key;
V value;
final int hash;
HashMapEntry<K, V> next;
5淆两、Entry 存儲數(shù)據(jù)規(guī)則:通過key的hash值對HashMap數(shù)組的長度取余得到entry的存儲位置,
計(jì)算公式為hash(key)%len拂酣,如果算出的結(jié)果重復(fù) 會(huì)直接以鏈表的形式連接在前一個(gè)entry的后面秋冰。
6、因?yàn)镠ashMap 默認(rèn)存儲大小就是一個(gè)容量為16的數(shù)組婶熬,所以創(chuàng)建HashMap就會(huì)分配一塊內(nèi)存給HashMap剑勾。
7埃撵、當(dāng)HashMap的存儲達(dá)到一定容量時(shí),會(huì)自動(dòng)擴(kuò)容虽另,擴(kuò)容因子默認(rèn)是0.75.
8暂刘、HashMap 擴(kuò)容 需要不斷的進(jìn)行hash運(yùn)算 對于android來說是很消耗資源的。
SparseArray:
1捂刺、SparseArray 比 HashMap更節(jié)省內(nèi)存(主要原因是它避免了對key的自動(dòng)裝箱(int轉(zhuǎn)為Integer類型))谣拣。
2、它的內(nèi)部通過兩個(gè)數(shù)組來進(jìn)行存儲數(shù)據(jù)族展,一個(gè)存儲key一個(gè)存儲value
private int[] mKeys;
private Object[] mValues;
3森缠、內(nèi)部對數(shù)據(jù)采取了壓縮的方式表示稀疏數(shù)組。
4仪缸、存取和讀取數(shù)據(jù)的時(shí)候采用二分法查找贵涵。
5、添加數(shù)據(jù)的時(shí)候 會(huì)采用二分查找法和之前的key比較大小腹殿,然后按照從小到大的順序排好独悴。
6、獲取數(shù)據(jù)的時(shí)候也是采用二分法查找锣尉,而HashMap是通過遍歷Entry【】來獲取,速度比HashMap快决采。
7自沧、由于添加 查找 刪除 都會(huì)進(jìn)行二分查找 所以對于數(shù)據(jù)量大的話 效果不明顯。
8树瞭、適用場景:1拇厢、數(shù)據(jù)量小,最好千級以下
2晒喷、key值是int類型
ArrayMap
1孝偎、內(nèi)部也是采用兩個(gè)數(shù)組來存儲,一個(gè)存儲key的hash值 一個(gè)存儲value值
2凉敲、也使用二分法對key進(jìn)行排序衣盾,查找 刪除 添加 也都是會(huì)進(jìn)行二分查找
3、適用場景:1爷抓、數(shù)據(jù)量小势决,最好千級以下
2、key值是int類型