天天看點

JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類

JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類

版權聲明:轉載必須注明本文轉自程式員杜鵬程的部落格:http://blog.csdn.net/m366917

今天一覺醒來,朋友圈都是慶祝女排12後再次獲得奧運冠軍,有種精神叫做女排精神,學習女排,振興中華。我們先讓自己強大起來,整個祖國都會變的很強大

我們來繼續學習集合的最後一個知識點,Map集合

Map集合

  • 概述
    • 将鍵映射到值的對象
    • 一個映射不能包含重複的鍵
    • 每個鍵最多隻能映射到一個值
前面我們一直在學Collection集合,那麼它和Map集合有什麼差別呢?
  • Map集合存儲元素是成對出現的,Map集合的鍵是唯一的,值是可重複的。可以把這個了解為:夫妻對
  • Collection集合存儲元素是單獨出現的,Collection的兒子Set是唯一的,List是可重複的。可以把這個了解為:光棍
  • 注意:
    • Map集合的資料結構值針對鍵有效,跟值無關
    • Collection集合的資料結構是針對元素有效

下面我們來了解Map集合的功能概述

  • 添加功能
    • V put(K key,V value):添加元素。
public class MapDemo {
    public static void main(String[] args) {
        // 建立集合對象
        Map<String, String> map = new HashMap<String, String>();
        System.out.println("put:" + map.put("馬蓉", "王寶強"));
        System.out.println("put:" + map.put("馬蓉", "宋喆"));
         // 輸出集合名稱
        System.out.println("map:" + map);
    }
}
           
我們來看輸出結果:
JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類

第一次為什麼是null呢?而第二次傳回的是王寶強呢?最後奇怪的是馬蓉和宋喆真像現實中一樣。我來給大家說說這是為什麼?

因為如果鍵是第一次存儲,就直接存儲元素,傳回null

如果鍵不是第一次存在,就用值把以前的值替換掉,傳回以前的值

現在明白了吧。

但是我們平時添加元素不是這樣添加的,是下面這樣

// 建立集合對象
        Map<String, String> map = new HashMap<String, String>();
        // 添加元素
        map.put("鄧超", "孫俪");
        map.put("黃曉明", "楊穎");
        map.put("周傑倫", "昆淩");
        map.put("劉恺威", "楊幂");
        // 輸出集合名稱
        System.out.println("map:" + map);
           

輸出結果:map:{鄧超=孫俪, 周傑倫=昆淩, 黃曉明=楊穎, 劉恺威=楊幂}

我們繼續

  • 删除功能
    • void clear():移除所有的鍵值對元素
    • V remove(Object key):根據鍵删除鍵值對元素,并把值傳回

我們在上面添加元素的基礎上來學習這個删除功能

map.clear();//會移除所有的鍵值對元素
    System.out.println("map:" + map);//map:{} //是以不建議使用

    //V remove(Object key):根據鍵删除鍵值對元素,并把值傳回
    System.out.println("remove:" + map.remove("黃曉明"));
    System.out.println("remove:" + map.remove("黃曉波"));
    // 輸出集合名稱
    System.out.println("map:" + map);
           
根據鍵删除對于值的元素輸出結果
JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類

我們發現當這個鍵存在的時候,删除會傳回對應的值,

不存在的時候,删除會傳回null

  • 判斷功能
    • boolean containsKey(Object key):判斷集合是否包含指定的鍵
    • boolean containsValue(Object value):判斷集合是否包含指定的值
    • boolean isEmpty():判斷集合是否為空
//boolean containsKey(Object key):判斷集合是否包含指定的鍵
    System.out.println("containsKey:" + map.containsKey("黃曉明"));
    System.out.println("containsKey:" + map.containsKey("黃曉波"));
    // 輸出集合名稱
    System.out.println("map:" + map);
    //boolean isEmpty():判斷集合是否為空
    System.out.println("isEmpty:"+map.isEmpty());
           
這個就比較簡單了,判斷集合是否包含指定的值,我就不說了,和鍵一樣,給大家看一下輸出結果
JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類
我們看到判斷并不會影響他的輸出結果
  • 長度功能
    • int size():傳回集合中的鍵值對的對數
//這個也比較簡單了
    System.out.println("size:"+map.size());//size:4
           

下面我們重點看一下Map的擷取功能

  • 擷取功能
    • V get(Object key):根據鍵擷取值
    • Set keySet():擷取集合中所有鍵的集合
    • Collection values():擷取集合中所有值的集合
    • Set< Map.Entry< K,V>> entrySet():傳回的是鍵值對對象的集合
public class MapDemo {
    public static void main(String[] args) {
        // 建立集合對象
        Map<String, String> map = new HashMap<String, String>();

        // 建立元素并添加元素
        map.put("鄧超", "孫俪");
        map.put("黃曉明", "楊穎");
        map.put("周傑倫", "蔡依林");
        map.put("劉恺威", "楊幂");

        // V get(Object key):根據鍵擷取值
        System.out.println("get:" + map.get("周傑倫"));
        System.out.println("get:" + map.get("周傑")); // 傳回null

        // Set<K> keySet():擷取集合中所有鍵的集合
        Set<String> set = map.keySet();
        for (String key : set) {
            System.out.println("key:"+key);
        }

        // Collection<V> values():擷取集合中所有值的集合
        Collection<String> con = map.values();
        for (String value : con) {
            System.out.println("value:"+value);
        }
        // 擷取所有鍵值對對象的集合
        Set<Map.Entry<String, String>> set1 = map.entrySet();
        // 周遊鍵值對對象的集合,得到每一個鍵值對對象
        for (Map.Entry<String, String> me : set1) {
            // 根據鍵值對對象擷取鍵和值
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key + "---" + value);
        }
    }
}
           
這個還是很好了解的,最重要的就是周遊得到每一個鍵值對對象,看下輸出結果
JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類

下面我們來看

Map子類

HashMap

  • HashMap類概述
    • 鍵是哈希表結構,可以保證鍵的唯一性
  • 常用案例
    • HashMap< String,String>
    • HashMap< Integer,String>
    • HashMap< String,Student>
    • HashMap< Student,String>
    • 上面的也不是非要是學生對象,可以是你需求的對象

LinkedHashMap

  • 概述
    • Map 接口的哈希表和連結清單實作,具有可預知的疊代順序。
    • 由哈希表保證鍵的唯一性,不可重複
    • 由連結清單保證鍵盤的有序(存儲和取出的順序一緻)

TreeMap

  • 概述
    • 鍵是紅黑樹結構,可以保證鍵的排序和唯一性
Map集合的知識點和它的子類我上面都将到了,下面我們來做道練習題吧
  • HashMap和Hashtable的差別?
public class HashtableDemo {
    public static void main(String[] args) {
         HashMap<String, String> hm = new HashMap<String, String>();    

        hm.put("android", "hello");
        hm.put(null, "world"); 
        hm.put("java", null); 
        System.out.println(hm);

        Hashtable<String, String> ht = new Hashtable<String, String>();
        ht.put("android", "hello");
        ht.put(null, "world"); //NullPointerException
        ht.put("java", null); // NullPointerException
        System.out.println(ht);
    }
}
           

在輸出結果中:HashMap會列印出{null=world, java=null, android=hello}

而在Hashtable中會報錯

是以我們就能得出他們的差別

  • HashMap:線程不安全,效率高。允許null鍵和null值
  • Hashtable:線程安全,效率低。不允許null鍵和null值

我們再來學習一個知識點

Collections類

我們之前學習了Collection,那麼它和Collections有什麼差別呢。

我們先來了解Collections類,然後在來說他們之間的差別

  • Collections類概述
    • 針對集合進行操作的工具類,都是靜态方法。
  • Collection和Collections的差別
    • Collection:是單列集合的頂層接口,有子接口List和Set。
    • Collections:是針對集合操作的工具類,有對集合進行排序和二分查找的方法
  • Collections成員方法
    • public static < T> void sort(List list):排序 預設情況下是自然順序。
    • public static < T> int binarySearch(List< ?> list,T key):二分查找
    • public static < T> T max(Collection< ?> coll):最大值
    • public static void reverse(List< ?> list):反轉
    • public static void shuffle(List< ?> list):随機置換

我們來練習一下

public class CollectionsDemo {
    public static void main(String[] args) {
        // 建立集合對象
        List<Integer> list = new ArrayList<Integer>();

        // 添加元素
        list.add();
        list.add();
        list.add();
        list.add();
        list.add();

        System.out.println("list:" + list);

        // public static <T> void sort(List<T> list):排序 預設情況下是自然順序。
         Collections.sort(list);
         System.out.println("自然順序list:" + list);

        // public static <T> int binarySearch(List<?> list,T key):二分查找
         System.out.println("二分查找:" + Collections.binarySearch(list, ));
         System.out.println("二分查找:"+ Collections.binarySearch(list, ));

        // public static <T> T max(Collection<?> coll):最大值
         System.out.println("max:"+Collections.max(list));

        // public static void reverse(List<?> list):反轉
         Collections.reverse(list);
         System.out.println("list:" + list);

        //public static void shuffle(List<?> list):随機置換
        Collections.shuffle(list);
        System.out.println("list:" + list);
    }
}
           
我們來看下輸出結果:
JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類JAVA基礎再回首(十八)——Map集合概述及成員方法、Map集合的三個子類、Collections類

看到結果是不是二分查找不存在的時候傳回-6為什麼呢。

因為當二分查找不存在的時候,它就會傳回最大索引+1再+1.

上面的排序功能,它在預設情況下是自然順序,如果我們要存儲一個自定義對象,那麼他就不說自然排序了,就要用到我們上一篇講到的比較器Comparator排序了,大家要注意一下

好了,到這裡,我們就把集合基本上學完了。下一篇,我們就要開始IO流的學習了,你準備好了嗎?

歡迎有興趣的同學加我朋友的QQ群:點選直接加群555974449 請備注:java基礎再回首我們一起來玩吧。