Map
Map這是Java語言自帶的一種容器
使用起來比較簡單,很多數(shù)據(jù)結(jié)構(gòu)中用的相當(dāng)頻繁屎暇,
眾所周知承桥,Map是一個(gè)接口。我們看下關(guān)于
A根悼、Map的集合實(shí)現(xiàn)凶异,鍵值對(duì)的一一對(duì)象存儲(chǔ)關(guān)系。
** B挤巡、Map集合中不能包含相同的key(鍵值)--此處是通過Key的散列碼區(qū)分唠帝。**
Map相關(guān)的方法:
clear():清除Map集合的所有數(shù)據(jù)。
containKey(Object var1):是否包含鍵玄柏。返回的數(shù)boolean數(shù)據(jù)襟衰。
containValue(Object var1):是否包含某個(gè)值。
isEmpty():是否為空粪摘。
put(K var1, V var2):添加鍵值對(duì)瀑晒。
putAll(Map<? extends K, ? extends V> var1);添加一個(gè)Map集合(但是兩個(gè)集合的鍵值對(duì)的對(duì)象是同類的)。
remove(Object var1):刪除某個(gè)鍵值對(duì)徘意。參數(shù)是key值苔悦。
size():Map集合的大小。
Map集合的遍歷方式:
1椎咧、迭代器遍歷
Iterator iterator = map.entrySet().iterator();
while ( iterator.hasNext() ) {
Map.Entry entry = (Map.Entry) iterator.next();
Object valueObject = entry.getValue();
Object keyObject = entry.getKey();
}
2玖详、foreach遍歷
for (Map.Entry entry : map.entrySet()) {
Object keyObject = entry.getKey();
Object valueObject = entry.getValue();
}
3、單獨(dú)取值遍歷
Map<Object, Object> map = new HashMap();
for (Object object : map.keySet()) {
//獲取到的是Key.
}
for(Object object : map.values()){
//獲取的是values.
}
Map實(shí)現(xiàn)類的相關(guān)介紹
(1)HashMap是一個(gè)最常用的Map勤讽,它根據(jù)鍵的hashCode值存儲(chǔ)數(shù)據(jù)蟋座,根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度脚牍。
A向臀、HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null诸狭。
B券膀、HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫HashMap驯遇,可能會(huì)導(dǎo)致數(shù)據(jù)的不一致芹彬。
C、如果需要同步叉庐,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力舒帮。
(2)Hashtable與HashMap類似,不同的是:
A、它不允許記錄的鍵或者值為空会前;
B好乐、它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫Hashtable瓦宜,然而蔚万,這也導(dǎo)致了Hashtable在寫入時(shí)會(huì)比較慢。
(3)LinkedHashMap保存了記錄的插入順序临庇,在用Iteraor遍歷LinkedHashMap時(shí)反璃,先得到的記錄肯定是先插入的。 在遍歷的時(shí)候會(huì)比HashMa慢假夺。
(4)TreeMap能夠把它保存的記錄根據(jù)鍵排序淮蜈,默認(rèn)是按升序排序,也可以指定排序的比較器已卷。當(dāng)用Iteraor遍歷TreeMap時(shí)梧田,得到的記錄是排過的。
SparseArray
SparseArray是Android里了替代hashMap這樣的數(shù)據(jù)結(jié)構(gòu)的產(chǎn)生的 目的是為了提高內(nèi)存的使用效率侧蘸。(SparseArray采用的是折半查找)
SparseArray相關(guān)特點(diǎn)
在google的官方文檔中也提及到了內(nèi)存效率高些裁眯。主要是有以下兩點(diǎn)吧(與HashMap相比)
A、不需要進(jìn)行對(duì)象轉(zhuǎn)化讳癌。(HashMap的鍵值都是對(duì)象穿稳。SparseArray是常見的數(shù)據(jù)類型)。
B晌坤、數(shù)據(jù)結(jié)構(gòu)的差異逢艘,與hashMap的散列碼以及哈希值不一樣的在于,底層的是用過一個(gè)數(shù)組實(shí)現(xiàn)的骤菠。通過折半對(duì)數(shù)組進(jìn)行一系列的操作它改,所以其實(shí)在查詢上可能還會(huì)比HashMap慢,但是在添加和刪除操作中娩怎,會(huì)提高百分之50的內(nèi)存效率搔课。
C胰柑、大量的數(shù)據(jù)我們相對(duì)SparseArray會(huì)優(yōu)先選擇HashMap截亦,如果數(shù)據(jù)在幾百個(gè)這個(gè)數(shù)目, 那么選擇它們?nèi)我庖粋€(gè)去實(shí)現(xiàn)區(qū)別不大柬讨,如果數(shù)量較少崩瓤,就選擇SparseArray去實(shí)現(xiàn)。
SparseArray相關(guān)的方法
每個(gè)數(shù)據(jù)結(jié)構(gòu)踩官,無非就是增刪改查
- clone() 克隆一個(gè)與當(dāng)前SparseArray不是同一個(gè)存儲(chǔ)地址的SparseAarry相當(dāng)于 new 一個(gè)當(dāng)前的SparseArray.
- 增
append(int key, E value) 添加數(shù)據(jù)的時(shí)候却桶,相當(dāng)于StringBuilder的添加方法,在最后一位添加。
-
put(int key, E value)
這個(gè)就和HashMap差不多吧颖系,如果當(dāng)前有key的話就替代value之前已經(jīng)有的嗅剖。
其實(shí)我后來研究了一下,這兩個(gè)方法本質(zhì)是一樣的 沒有什么區(qū)別嘁扼。都是一樣的功能如果只是單純看文檔說明就是上面我說的意思信粮。我們來看看源碼吧
/**
* Puts a key/value pair into the array, optimizing for the case where
* the key is greater than all existing keys in the array.
*/
public void append(int key, E value) {
if (mSize != 0 && key <= mKeys[mSize - 1]) {
put(key, value);
return;
}
if (mGarbage && mSize >= mKeys.length) {
gc();
}
mKeys = GrowingArrayUtils.append(mKeys, mSize, key);
mValues = GrowingArrayUtils.append(mValues, mSize, value);
mSize++;
}
append方法還是會(huì)調(diào)put方法的。
-
刪
- delete(int key)
-
remove(int key)
上面的方法都是通過刪除的方式趁啸,其實(shí)是一樣的强缘。 - removeAt(int index) 這就是通過索引值刪除這數(shù)據(jù)。
- clear() 清空所有的Key-Values的數(shù)據(jù).
remove()源碼如下:
/**
* Alias for {@link #delete(int)}.
*/
public void remove(int key) {
delete(key);
}
-
改
- **setValueAt(int index, E value) ** 修改對(duì)應(yīng)該的index去修改對(duì)應(yīng)的Value
- 還有就是put以及append方法了不傅。這也是修改數(shù)據(jù)的方法旅掂。
-
查
- indexOfKey(int key) 和 indexOfValue(E value) 查找索引值(角標(biāo))。
- keyAt(int index) 和 valueAt(int index)就是通過索引值查找對(duì)于的key和Value.
-
gc()
- 這是SparseArray自己構(gòu)建的回收機(jī)制访娶。
SparseArray的遍歷
for (int x = 0; x < sparseArray.size();x ++){
int key = sparseArray.keyAt(x);
String values = sparseArray.valueAt(x);
}
可以只取key或者Values. 看個(gè)人需求商虐。
以上有什么有問題的地方,多多擔(dān)待