這兩天看了一下關於Map及子類的東西,做一下小結。
Map
Map集合裏存儲的是具有映射關係的鍵值對,什麼是映射關係,就跟數學當中的函數映射差不多,一個x值對應一個y值。Map中也一樣,裏面的“鍵”就相當於x值,“值”相當於y值。鍵值是不能重複的,每個鍵最多映射一個值。Map接口提供三種Collection接口,允許以鍵集合——KetSet,值集合——Values和鍵值對集合EntrySet來產看映射的內容。映射的順序爲迭代器在Collection視圖中返回的順序,有些映射是有順序的如TreeMap,有些沒有如HashMap。(Map中是沒有直接的迭代器,實質是獲得鍵集合或鍵-值的Set集合以及值集合的Collection,然後用這些集合的迭代器進行迭代,我是這樣理解的,不知道對不對).Map中有一些常規的方法,如put,get,clear等,通過代碼進行說明。
public class MapDemo {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(8,"zhaoliu"); //添加元素
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");
<span style="font-family:FangSong_GB2312;">//得到map中“值”的集合</span>
Collection<String> values = map.values();
<span style="font-family:FangSong_GB2312;">//調用迭代器</span>
Iterator<String> it2 = values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
}
}
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");
//獲得map中鍵的集合,然後得到它的迭代器,遍歷,再通過鍵值獲得
<span style="font-family:FangSong_GB2312;">//</span>元素值
Set<Integer> keySet = map.keySet();
Iterator<Integer> it = keySet.iterator();
while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);
}
//獲得map中鍵-值的集合,其中Map.Entry<Ingeter,String> 是映射關係的類型,Entrt是Map中的內部接口
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<Integer, String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::::"+value);
}
HashMap
基於hash表的Map接口的實現,可以允許null值和null鍵,此類不能保證映射的順序。HashMap是不同步的,線程不安全的,因次當多個線程訪問此線程,其中至少一個線程從結構上修改了該映射,則必須保持外部同步。什麼結構上修改?就是指增加或刪除一個或多個映射關係的操作,而那些修改了已經存在的映射關係的值的操作則不是結構上修改。
HashMap的實例有兩個實例會影響其性能:初始容量和加載因子。初始容量就是這個HashMap中數組的大小,加載因子就是當元素達到數組大小的多少時,就開始擴充數組大小。HashMap默認的初始容量爲16,加載因子爲0.75,也就是說當元素達到12個的時候,將調用rehash開始進行數組的擴充。
Hashtable
Hashtale是一個比較老的類,現在基本很少使用,與HashMap相比,它是線程安全的,因次性能上要比HashMap低,且不允許使用null作爲鍵和值。
HashMap和Hashtable都是兩個key通過equals方法比較返回true,並且兩個key的hashcode值也相同。
LinkedHashMap
Map接口哈希表和鏈接表的實現,具有可預知的迭代順序。它與HashMap不同,維護着一個運行於所有條目的雙重連接表,這個鏈接表定義了迭代順序,此迭代順序通常就是插入到映射中的順序。
TreeMap
SortedMap接口的基於紅黑樹的實現,此類保證了映射按照升序循序排列關鍵字,根據使用的構造方法不同,可能按照鍵的類的自然順序進行排序,或者在創建時按照所實現的比較器進行排序。該實現也是不同步的。