天天看點

3.集合-Map

Map集合

    • 1.Map接口實作類的特點
      • 1.EntrySet介紹
    • 2.Map接口常用方法
    • 3.Map接口周遊方法
      • 1.keySet周遊
      • 2.values周遊
      • 3.EntrySet周遊
    • 4.HashMap小結
    • 5.HashTable的基本介紹
      • 1.HashTable底層簡單說明
    • 6.Hashtable和HashMap對比
    • 7.Properties
    • 8.開發中如何選擇集合實作類
    • 9.TreeSet和TreeMap排序
      • 1.TreeSet
      • 2.TreeMap
    • 10.Collections工具類
      • 1.Collections工具類介紹
      • 2.排序操作
      • 3.查找與替換操作

1.Map接口實作類的特點

注意:這裡講的是JDK8的Map接口特點

  1. Map與Collection并列存在,用于儲存具有映射關系的資料key-value;
  2. Map中的key和value可以是任何引用類型的資料,會封裝到HashMap$Node對象中;
  3. Map中的key不允許重複;
  4. Map中的value可以重複;
  5. Map的key可以為null,value也可以為null,注意key為null隻能有一個,value為null,可以多個;
  6. 常用String類作為Map的key;
  7. key和value之間存在單向一對一關系,即通過指定的key總能找到對應的value;
  8. Map存放資料的key-value,一對k-v是放在一個Node中的,又因為Node實作了Enty接口,有些書上也說,一對k-v就是一個Entry。

1.EntrySet介紹

  1. k-v 最後是 HashMap$Node node = new Node(hash,key,value,null);
  2. k-v為了友善程式員周遊,還會建立EntrySet集合,該集合存放的元素類型是Entry,而Entry對象就有k-v【EntrySet<Entry<K,V>>】。
  3. entry中,定義的類型是Map.Entry ,但是實際上存放的還是HashMap N o d e , 這 是 因 為 H a s h M a p Node,這是因為HashMap Node,這是因為HashMapNode implments Map.Entry。
  4. 當把HashMap$Node對象存放到EntrySet就友善我們周遊了,因為Map.Entry提供了重要的方法getKey()和getValue()。

2.Map接口常用方法

  1. put 添加
  2. remove 根據鍵删除映射關系
  3. get 根據鍵擷取值
  4. size 擷取元素個數
  5. isEmpty 判斷個數是否為0
  6. containsKey 查找鍵是否存在

3.Map接口周遊方法

  1. containsKey 查找鍵是否存在
  2. keySet 擷取所有的鍵
  3. entrySet 擷取所有關系
  4. values 擷取所有的值

1.keySet周遊

Map map = new HashMap();
        map.put("A","1");
        map.put("B","2");
        map.put("C","3");
        map.put("D","4");

        //第一組:先取出所有的key,通過key取出對應的value
        Set keyset = map.keySet();
        //1.增強for
        for(Object key:keyset){
            System.out.println(key + "-" + map.get(key));
        }

        //2.疊代器
        Iterator iterator = keyset.iterator();
        while (iterator.hasNext()){
            Object key = iterator.next();
            System.out.println(key + "-" + map.get(key));
        }

           

2.values周遊

Map map = new HashMap();
        map.put("A","1");
        map.put("B","2");
        map.put("C","3");
        map.put("D","4");
        //第二組,把所有的values取出來
        Collection values = map.values();
        //這裡可以使用所有的Collections使用的周遊方法
        //1.增強for
        //取出所有的值
        for(Object value:values){
            System.out.println(value);
        }

        //2.疊代器
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()){
            Object value = iterator1.next();
            System.out.println(value);
        }

           

3.EntrySet周遊

Map map = new HashMap();
        map.put("A","1");
        map.put("B","2");
        map.put("C","3");
        map.put("D","4");
        //第三組,通過EntrySet 來擷取k-v
        Set entrySet = map.entrySet();
        //1.增強for
        for (Object entry : entrySet){
            //将entry轉成Map.Entry
            Map.Entry m = (Map.Entry) entry;
            System.out.println(m.getKey() + "-" + m.getValue());
        }

        //2.疊代器
        Iterator iterator2 = entrySet.iterator();
        while (iterator2.hasNext()){
            Map.Entry m = (Map.Entry) iterator2.next();
            System.out.println(m.getKey() + "-" + m.getValue());
        }
           

4.HashMap小結

  1. Map接口的常用實作類:HashMap、hashtable、properties;
  2. HashMap是Map接口使用頻率最高的實作類;
  3. HashMap是以key-value對的方式存儲資料;
  4. key不能重複,但是值礦業重複,允許使用null鍵和null值;
  5. 如果添加相同的key,則會覆寫原來的值;
  6. 與hashSet一樣,不保證映射的順序,因為底層是以hash表的方式來存儲的;
  7. HashMap沒有實作同步,是以是線程不安全的。

5.HashTable的基本介紹

  1. 存放的元素時鍵值對:即K-V;
  2. hashtable的鍵和值都不能為null;
  3. hashtable使用方法基本上和HashMap一樣;
  4. hashtable是線程安全,HashMap是線程不安全;

1.HashTable底層簡單說明

  1. 底層有數組Hashtable$Entry[] 初始化大小為11;
  2. threshold 8 = 11 * 0.75;臨界值
  3. 擴容:(前容量*2)+1 ;

6.Hashtable和HashMap對比

版本 線程安全(同步) 效率 允許null鍵null值
HashMap 1.2 不安全 可以
Hashtable 1.0 安全 較低 不可以

7.Properties

  1. Properties類繼承自Hashtable 類并且實作了Map接口,也是使用一種鍵值對的形式來儲存資料;
  2. 它的使用特點和Hashtable類似;
  3. Properties還可以用于從xxx.properties檔案中,加載資料到Properties類對象,并進行讀取和修改;

8.開發中如何選擇集合實作類

  1. 先判斷存儲的類型(一組對象或一組鍵值對);
  2. 一組對象:Collection接口

    允許重複:List

    增删多:LinkedList【底層維護了一個雙向連結清單】

    改查多:ArrayList 【底層維護了Object類型的可變數組】

    不允許重複:Set

    無排序:HashSet 【底層是HashMap ,維護了一個哈希表,即數組+連結清單+紅黑樹】

    排序: TreeSet

    插入和取出順序一緻:LinkedHashSet (底層是LinkHashMap(底層是HashMap))【維護數組+雙向連結清單】

  3. 一組鍵值對:Map

    鍵無序: HashMap 【底層是:哈希表;jdk7:數組+連結清單;jdk8:數組+連結清單+紅黑樹】

    鍵排序:TreeMap

    鍵插入和取出順序一緻:LinkedHashMap

    讀取檔案:Properties

9.TreeSet和TreeMap排序

1.TreeSet

//排序
        TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //調用Sting的compareTo方法比較大小
                return ((String)o2).compareTo((String)o1);
            }
        });

        treeSet.add("a");
        treeSet.add("b");
        treeSet.add("c");
        treeSet.add("d");

        System.out.println(treeSet);
           

2.TreeMap

//[排序
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //調用Sting的compareTo方法比較大小
                return ((String)o1).compareTo((String)o2);
            }
        });
        treeMap.put("a","1");
        treeMap.put("b","2");
        treeMap.put("c","3");
        treeMap.put("d","4");
           

10.Collections工具類

1.Collections工具類介紹

  1. Collections是一個操作Set、List和Map等集合的工具類;
  2. Collections中提供了一系列靜态的方法對集合元素進行排序、查詢和修改等操作。

2.排序操作

  1. reverse(List):反轉List中元素的排序;
  2. shuffle(List):對List集合元素進行随機排序;
  3. sort(List):根據元素的自然順序對指定List集合元素按升序排序;
  4. sort(List、Comparator):根據指定的Comparator産生的順序對List集合元素進行排序;
  5. swap(List、int、int):将指定List集合中的i處元素和j處元素進行交換。

3.查找與替換操作

  1. Object max(Collection):根據元素的自然順序,傳回給定集合中的最大元素;
  2. Object max(Collection , Comparator):根據Comparator指定的順序,傳回給定集合中的最大元素;
  3. Object min(Collection);
  4. Object min(Collection , Comparator);
  5. int frequency(Collection , Object):傳回指定集合中指定元素的出現次數;
  6. void copy(List dest , List src):将src中的内容複制到dest中;
  7. boolean replaceAll(List list , Object oldVal , Object newVal):使用新值替換List對象的所有舊值。