接上一個部落格有關Collection集合框架,對集閤中另一個介面Map進行介紹,先來一張圖回顧一下關係
map儲存的是k-v鍵值對對映的數據
Map子類:
HashMap:數據+鏈表(1.7) 陣列+鏈表+紅黑樹(1.8)
LinkedHashMap:鏈表
TreeMap:紅黑樹
基本api操作:
增加: put(k,v) 新增元素
查詢: isEmpty 判斷是否爲空
size 返回map的大小
containsKey
containsValue
get
刪除: clear 清空集閤中的所有元素
remove:刪除指定元素
遍歷操作:
(1)利用key遍歷: Set keys = map.keySet();
for(String key:keys){
System.out.println(key+"="+map.get(key));
}
(2)利用value遍歷: Set keys = map.keySet();
for(String key:keys){
System.out.println(key+"="+map.get(key));
}//只能獲取對應的value值,不能根據value來獲取key
(3)迭代器(value無法使用迭代器):
Set keys2 = map.keySet();
Iterator iterator = keys2.iterator();
while(iterator.hasNext()){
String key = iterator.next();
System.out.println(key+"="+map.get(key));
}
(4)Map.entry:一個介面,表示的是K-V組合的一組對映關係,key和value成組出現,遍歷只能通過迭代器來遍歷
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator1 = entries.iterator();
while (iterator1.hasNext()){
Map.Entry<String, Integer> next = iterator1.next();
System.out.println(next.getKey()+"–"+next.getValue());
}
Map api的一些應用舉例:
public class MapDemo {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String,Integer>(13);
map.put("a",1);
map.put("b",2);
map.put("c",3);
map.put("d",4);
map.put(null,null);
System.out.println(map);
System.out.println(map.isEmpty());
System.out.println(map.size());
// map.clear();
System.out.println(map.containsKey("a"));
System.out.println(map.containsValue(2));
System.out.println(map.get("a"));
map.remove("a");
System.out.println(map);
//遍歷操作
Set<String> keys = map.keySet();
for(String key:keys){
System.out.println(key+"="+map.get(key));
}
//只能獲取對應的value值,不能根據value來獲取key
Collection<Integer> values = map.values();
for (Integer i:values){
System.out.println(i);
}
//迭代器
Set<String> keys2 = map.keySet();
Iterator<String> iterator = keys2.iterator();
while(iterator.hasNext()){
String key = iterator.next();
System.out.println(key+"="+map.get(key));
}
//Map.entry
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator1 = entries.iterator();
while (iterator1.hasNext()){
Map.Entry<String, Integer> next = iterator1.next();
System.out.println(next.getKey()+"--"+next.getValue());
}
}
}
hashmap跟hashtable的區別:
1、hashmap執行緒不安全,效率比較高,hashtable執行緒安全,效率低
2、hashmap中key和value都可以爲空,hashtable不允許爲空
hashmap初始值爲2的N次冪,
1、方便進行&操作,提高效率,&要比取模運算效率要高
hash & (initCapacity-1)
2、在擴容之後涉及到元素的遷移過程,遷移的時候只需要判斷二進制的前一位是0或者是1即可。如果是0,表示新陣列和就陣列的下標位置不變,如果是1,只需要將索引位置加上舊的陣列的長度值即爲新陣列的下標
hashmap1.7原始碼知識點: 陣列+鏈表
1、預設初始容量 16
2、載入因子0.75
3、put操作
1、設定值,計算hash
2、擴容操作
3、數據遷移的過程,頭插法
1.8原始碼知識點: 陣列+鏈表+紅黑樹(當鏈表長度超過7,將鏈表轉爲一個紅黑樹)