1、Map集合的特點:
(1)每次存儲一對元素,即鍵值對(key,vlaue);
(2)key和value的數據類型可以相同,也可以不同;
(3)key不能重復,如果key相同,后面存儲的value會把前面的value覆蓋;
2、Map接口的實現類:
(1)HashMap:無序集合,存儲元素和取出元素的順序可能不一致;允許存儲null值、null鍵;
底層數據結構:哈希表
(2)LinkedHashMap:有序集合,存儲元素和取出元素的順序一直;
底層數據結構:哈希表+鏈表
3、哈希表數據結構(鏈表,數組結合體)
(1)特點:存儲、取出快;線程不安全,運行快;無序,沒有索引;不存儲重復元素。
(2)實現原理:(豎向代表數組,java中,數組的初始長度默認為16,加載因子默認為0.75,即存儲數據時,數組的長度達到16*0.75=12時,數組擴大為原來的兩倍(數組再哈希);橫向代表鏈表)
(3)存儲過程:添加一個鍵值對時,首先計算key的hash值,相同hash值的元素放在一個數組元素(例:a[0])中,形成鏈表,即一個數組元素中存放的是具有相同hash值的鏈表。
當鏈表的長度太長時,鏈表就轉為紅黑樹,這樣大大提高了查找的效率。
4、HashMap的方法:
(1)創建對象:Map<key的類型,value的類型> map=new HashMap<key的類型,value的類型>();
例:Map<String,Integer> map=new HashMap<String,Integer>();
(2)存儲元素:V map.put(K,V); 一般情況下返回null,存儲重復鍵時,返回覆蓋之前的值;
(3)取出元素:V map.get(K); 通過鍵,獲取值,如果集合中沒有這個鍵,返回null;
(4)移除元素: V map.remove(K); 移除集合中的鍵值對,返回被移除之前的值;
(5)map集合遍歷:
方法一:利用鍵獲取值
調用map集合的方法keySet,將所有的鍵存儲到Set集合中,利用迭代器或增強for,遍歷Set集合,獲取Set集合中的所有元素(即map中的鍵),調用get方法,通過鍵獲取值
例:Set<Key類型> set=map.keySet();
Iterator<Key類型> it=set.iterator();
while(it.hasNext()){
Key類型 key=it.next();
Value類型 value=map.get(key);
}
方法二:利用鍵值對映射關系
調用map集合的方法entrySet,將集合中的映射關系對象存儲到set集合中,利用迭代器或增強for,遍歷Set集合,獲取Set集合中的所有元素(映射關系對象Map.Entry<K類型,V類型>),
通過映射關系對象的方法getKey(),getValue()獲取相應的Key和Value
例:Set<Map.Entry<K類型,V類型>> set=map.entrySet();
for(Map.Entry<K類型,V類型> entry:set){
K類型 key=entry.getKey();
V類型 value=entry.getValue();
}
5、Hashtable:Map的接口實現類,方法與HashMap一樣,
不同點:Hashtable:線程安全,運行速度慢;
HashMap:線程不安全,運行速度快。