android 常用集合HashMap的使用和詳解
Java的集合類由Collection介面和Map介面派生
- 集合類的介面定義
1) Collection
一組"對立"的元素,每個位置只能儲存一個元素(物件),通常這些元素都服從某種規則
1.1) List必須保持元素特定的順序
1.2) Set不能有重複元素
1.3) Queue保持一個佇列(先進先出)的順序
2) Map
一組成對的"鍵值對"物件,就像一個小型資料庫。我們可以通過"鍵"找到該鍵對應的"值"
-
Java集合類架構層次關係
盜用一張圖來展示集合介面和它的實現類直接拿的關係
android常用的集合方法和實現類
-
Iterator:迭代器
它是Java集合的頂層介面(不包括 map 系列的集合,Map介面 是 map 系列集合的頂層介面)
檢視Collection原始碼可以看到它繼承的是類 Iterable,
Iterator :存在於 java.util 包中。核心的方法
- Object next():返回迭代器剛越過的元素的引用,返回值是 Object,需要強制轉換成自己需要的型別
- boolean hasNext():判斷容器內是否還有可供訪問的元素
- void remove():刪除迭代器剛越過的元素
這裡我們引用一個Iterator 的實現類 ArrayList 來看一下迭代器的使用:暫時先不管 List 集合是什麼,只需要看看迭代器的用法就行了
1 //產生一個 List 集合,典型實現為 ArrayList。 2 List list = new ArrayList(); 3 //新增三個元素 4 list.add("Tom"); 5 list.add("Bob"); 6 list.add("Marry"); 7 //構造 List 的迭代器 8 Iterator it = list.iterator(); 9 //通過迭代器遍歷元素 10 while(it.hasNext()){ 11 Object obj = it.next(); 12 System.out.println(obj); 13 }
- HashMap
繼承於AbstractMap,實現了Map、Cloneable、java.io.Serializable介面
簡單來說HashMap由陣列+連結串列組成的,陣列是HashMap的主體,連結串列則是主要為了解決雜湊衝突而存在的,如果定位到的陣列位置不含連結串列(當前entry的next指向null),那麼對於查詢,新增等操作很快,僅需一次定址即可;如果定位到的陣列包含連結串列,對於新增操作,其時間複雜度為O(n),首先遍歷連結串列,存在即覆蓋,否則新增;對於查詢操作來講,仍需遍歷連結串列,然後通過key物件的equals方法逐一比對查詢。所以,效能考慮,HashMap中的連結串列出現越少,效能才會越好。
它包括幾個重要的成員變數:table, size, threshold, loadFactor, modCount。
table是一個Entry[]陣列型別,而Entry實際上就是一個單向連結串列。雜湊表的"key-value鍵值對"都是儲存在Entry陣列中的。
size是HashMap的大小,它是HashMap儲存的鍵值對的數量。
threshold是HashMap的閾值,用於判斷是否需要調整HashMap的容量。threshold的值=“容量*載入因子”,當HashMap中儲存資料的數量達到threshold時,就需要將HashMap的容量加倍。
loadFactor就是載入因子。
modCount是用來實現fail-fast機制的。
Map:key-value 的鍵值對,key 不允許重複,value 可以
1、嚴格來說 Map 並不是一個集合,而是兩個集合之間 的對映關係。
2、這兩個集合每一條資料通過對映關係,我們可以看成是一條資料。即 Entry(key,value)。Map 可以看成是由多個 Entry 組成。
3、因為 Map 集合即沒有實現於 Collection 介面,也沒有實現 Iterable 介面,所以不能對 Map 集合進行 for-each 遍歷。
HashMap的主幹是一個Entry陣列。Entry是HashMap的基本組成單元,每一個Entry包含一個key-value鍵值對。
常用的hashMap遍歷:
遍歷Entry
for(Map.Entry<String, String> entry: map.entrySet())
{
System.out.println("Key: "+ entry.getKey()+ " Value: "+entry.getValue());
}
根據collection的Iterator遍歷,keySet原始碼可讀
for(String key:map.keySet())
{
System.out.println("Key: "+key+" Value: "+map.get(key));
}