Map集合

一. Map集合

1.1 概述

上一篇博客提到了集合按照其存儲結構可以分爲兩大類,分別是單列集合java.util.Collection和雙列集合java.util.Map

單例集合在上一篇博客已經總結,現在對雙列集合Map進行總結。

 java.util.Map<k,v>集合

 Map集合的特點:

1.Map集合是一個雙列集合,一個元素包含兩個值(一個key,一個value)

2.Map集合中的元素,key和value的數據類型可以相同也可以不同

3.Map集合中的元素,key是不允許重複的,value是可以重複的

4.Map集合中的元素,key和value是一一對應

1.2 Map常用子類

HashMap<K,V>:存儲數據採用哈希表結構,元素的存取順序不能保證一致。由於要保證鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。

java.util.HashMap<k,v>集合 implements Map<k,v>接口

HashMap集合的特點:

1.HashMap集合底層是哈希表:查詢的速度特別快

       JDK1.8之前:數組+單向鏈表

      JDK1.8之後:數組+單向鏈表/紅黑樹(鏈表的長度超過8) 提高查詢速度

2.hashMap集合是一個無序的集合,存儲元素和取出順序有可能不一致

3.HashMap集合只允許一條記錄的鍵爲NULL,TreeMap不允許鍵爲空

LinkedHashMap<K,V>:HashMap下有個子類LinkedHashMap,存儲數據採用的哈希表結構+鏈表結構。通過鏈表結構可以保證元素的存取順序一致;通過哈希表結構可以保證的鍵的唯一、不重複,需要重寫鍵的hashCode()方法、equals()方法。

java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合

LinkedHashMap的特點集合底層是哈希表+鏈表

1.LinkedHashMap的底層是哈希表+鏈表(保證了迭代的順序)

2.LinkedHashMap集合是一個有序的集合,存儲元素和取出元素的順序是一致的

1.3 Map接口中常用方法

- public V put(K key, V value) 把指定的鍵與指定的值添加到Map集合中。
- public V remove(Object key) 把指定的鍵 所對應的鍵值對元素 在Map集合中刪除,返回被刪除元素的值。
- public V get(Object key) 根據指定的鍵,在Map集合中獲取對應的值。
- boolean containsKey(Object key) 判斷集合中是否包含指定的鍵。
- public Set<K> keySet() 獲取Map集合中所有的鍵,存儲到Set集合中。
- public Set<Map.Entry<K,V>> entrySet() 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
        /*
        public V put(K key, V value)
             返回值:V
                 存儲"鍵值對"的時候,key不重複,返回值V是null
                 存儲"鍵值對"的時候,key重複,會使用新的value替換map中重複的value,返回被替換的value值
       */
        Map<String, Integer>  map = new HashMap<>();//創建 map對象

        //添加元素到集合
        map.put("科比", "24");
        map.put("詹姆斯", "23");
        System.out.println(map); //{科比=24,詹姆斯=23}

        /*
        public V remove(Object key)
             返回值:V
                 key存在,V返回被刪除的值
                 key不存在,V返回null
       */
        Integer v1 = map.remove("科比");
        System.out.println("v1:"+v1); //24
        /*
        public V get(Object key)
             返回值:V
                  key存在,返回對應的value值
                  key不存在,返回null
       */
        Integer v2 = map.get("詹姆斯");
        System.out.println("v2:"+v2);

提示:

使用put方法時,若指定的鍵(key)在集合中沒有,則沒有這個鍵對應的值,返回null,並把指定的鍵值添加到集合中;

若指定的鍵(key)在集合中存在,則返回值爲集合中鍵對應的值(該值爲替換前的值),並把指定鍵所對應的值,替換成指定的新值。

1.4 Map集合遍歷“鍵找值”方式

第一種:鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值

分析步驟:

  1. 獲取Map中所有的鍵,由於鍵是唯一的,所以返回一個Set集合存儲所有的鍵。使用:keyset()

  2. 遍歷鍵的Set集合,得到每一個鍵。

  3. 根據鍵,獲取鍵所對應的值。使用:get(K key)

        //1.使用Map集合中的方法KeySet(),把Map集合所有的key取出來,存儲到一個Set集合中
        Set<String> set = map.keySet();
        //2.使用迭代器遍歷Set集合
        Iterator<String> it = set.iterator();
        while(it.hasNext()){
            String key = it.next();
            //3.通過Map集合中的方法get(key),通過key找到value
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }
        System.out.println("==========");
        //使用增強for遍歷Set集合
        for(String key : set){ //也可以直接使用map.keySet()得到set集合
            //3.通過Map集合中的方法get(key),通過key找到value
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }

1.5 Entry鍵值對對象

Map中存放的是兩種對象,一種稱爲key(鍵),一種稱爲value(值),它們在在Map中是一一對應關係,這一對對象又稱做Map中的一個Entry(項)Entry將鍵值對的對應關係封裝成了對象。即鍵值對對象,這樣我們在遍歷Map集合時,就可以從每一個鍵值對(Entry)對象中獲取對應的鍵與對應的值。

  • public K getKey():獲取Entry對象中的鍵。

  • public V getValue():獲取Entry對象中的值。

在Map集合中也提供了獲取所有Entry對象的方法:

  • public Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。

1.6 Map集合遍歷鍵值對

第二種:鍵值對方式:即通過集合中每個鍵值對(Entry)對象,獲取鍵值對(Entry)對象中的鍵與值。

實現步驟:

     1.使用Map集合中的方法entrySet(),把集合中多個Entry對象取出來,存儲到一個Set集合中

     2.遍歷Set集合,獲取每一個Entry對象

     3.使用Entry對象中的方法getKey()和getValue()獲取健與值

        //1.使用Map集合中的方法entrySet(),把集合中多個Entry對象取出來,存儲到一個Set集合中
        Set<Map.Entry<String,Integer>> set = map.entrySet();
        //2.遍歷Set集合,獲取每一個Entry對象
        //使用迭代器遍歷Set集合
        Iterator<Map.Entry<String, Integer>> it = set.iterator();
        while(it.hasNext()){
            Map.Entry<String,Integer> entry = it.next();
            //3.使用Entry對象中的方法getKey()和getValue()獲取健與值
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }
        for (Map.Entry<String,Integer> entry:set) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }

1.7 HashMap存儲自定義類型鍵值

HashMap存儲自定義類型鍵值

Map集合保證key是唯一的:

當給HashMap中存放自定義對象時,如果自定義對象作爲key存在,

這時要保證對象唯一,必須複寫對象的hashCode和equals方法。

     /*
        HashMap存儲自定義類型鍵值
        key:Person類型
            Person類就必須重寫hashCode和equals方法,可以保證key唯一
        value:String類型
            可以重複
     */
    private static void show(){
        //創建HashMap集合
        HashMap<Person,String> map = new HashMap<>();
        //往集合中添加元素
        map.put(new Person("王五",18),"英國");
        map.put(new Person("張三",18),"秦國");
        map.put(new Person("李四",60),"中國");
        map.put(new Person("王五",18),"毛里求斯");
        //使用entrySet和增強for遍歷Map集合
        Set<Map.Entry<Person,String>> set = map.entrySet();
        for(Map.Entry<Person,String> entry:set){
            Person key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"->"+value);//Person{name='女王', age=18}->毛里求斯 key唯一,value替換
        }

1.8 LinkedHashMap

java.util.LinkedHashMap<K,V> extends HashMap<K,V>

底層原理: 哈希表+鏈表(記錄元素的順序)

        LinkedHashMap<String,String> linked = new LinkedHashMap<>();
        linked.put("a","a");
        linked.put("c","c");
        linked.put("b","b");
        linked.put("d","d");
        System.out.println(linked); //key不允許重複,有序{a=a, c=c, b=b, d=d}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章