Java 集合框架(二)Map

2020-08-10 10:34:58

Map

接上一個部落格有關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());
        }
    }
}

Map的常用子類:hashmap、hashtable、LinkedHashmap、TreeMap

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,將鏈表轉爲一個紅黑樹)