7月25號_Map集合

Map

今天的主要內容

  • Map接口概述

  • Map集合的兩種遍歷方式

    • 通過鍵找值keySet

    • 通過鍵值對對象獲取鍵和值

      • 涉及到Map.Entry的認識
  • HashMap

    • 自定義對象必須重寫equals和hashCode方法
  • LinkedHashMap

  • TreeMap

    • 統計字符串中每個字符出現的次數
  • HashMap和Hashtable的區別

    • 線程安全方面

    • 存儲鍵值對的數據類型方面

一、集合框架(Map集合概述和特點)

  1. Map接口概述

    • 查看API可以知道:

      • 將鍵映射到值的對象( maps keys to values)

      • 一個映射不能包含重復的鍵(A map cannot contain duplicate keys)

      • 每個鍵最多只能映射到一個值( each key can map to at most one value.)

  1. Map接口和Collection接口的不同

    • Map是雙列的,Collection是單列的

    • Map的鍵唯一,Collection的子體系Set是唯一的

    • Map集合的數據結構值針對鍵有效,跟值無關;Collection集合的數據結構是針對元素有效

二、集合框架(Map集合的功能概述)

  • A:Map集合的功能概述

    • a:添加功能

      • V put(K key,V value):添加元素。

        • 如果鍵是第一次存儲,就直接存儲元素,返回null

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

        • 相同的鍵不存儲,值覆蓋

    • b:刪除功能

      • void clear():移除所有的鍵值對元素

      • V remove(Object key):根據鍵刪除鍵值對元素,并把值返回

    • c:判斷功能

      • boolean containsKey(Object key):判斷集合是否包含指定的鍵

      • boolean containsValue(Object value):判斷集合是否包含指定的值

      • boolean isEmpty():判斷集合是否為空

    • d:獲取功能

      • Set<Map.Entry<K,V>> entrySet():

      • V get(Object key):根據鍵獲取值

      • Set<K> keySet():獲取集合中所有鍵的集合

      • Collection<V> values():獲取集合中所有值的集合

    • e:長度功能

      • int size():返回集合中的鍵值對的個數
  • 測試程序

      public class TestMap {
          public static void main(String[] args) {
              Map<String,Integer> map = new HashMap<>();
              
              //添加功能
              System.out.println("====V put(K key,V value):添加元素.====");
              testPut(map);
              
              //刪除功能
              System.out.println("====V remove(Object key):====");
              testRemove(map);
              
              //判斷功能
              System.out.println("==============判斷功能==============");
              testBoolean(map);
              
              System.out.println(" ==========e:長度功能 int size()==========");
              testSize(map);
          }
          
          public static void testPut(Map<String,Integer> map) {
              /*
                  a:添加功能
                      V put(K key,V value):添加元素。
                      * 如果鍵是第一次存儲,就直接存儲元素,返回null
                      * 如果鍵不是第一次存在,就用值把以前的值替換掉,返回以前的值
              */
              Integer i1  = map.put("小王", 21);
              Integer i2 = map.put("小李", 22);
              Integer i3 = map.put("小王", 23);
              Integer i4 = map.put("小花", 24);
              Integer i5 = map.put("小明", 25);
              
              System.out.println(map);
              System.out.println(i1);
              System.out.println(i2);
              System.out.println(i3);
              System.out.println(i4);
              System.out.println(i5);
              
              /*
               *   在JDK1.8中輸出結果為:
               *  -------------------------------
               *  ====V put(K key,V value):添加元素.====
                  {小李=22, 小明=25, 小王=23, 小花=24}
                  null        //返回null表示值沒有被覆蓋
                  null
                  21          //鍵相等,值覆蓋,返回被覆蓋的值
                  null
                  null
               * -------------------------------
               * */
          }
          
          public static void testRemove(Map<String,Integer> map) {
              /*
               * b:刪除功能
               * void clear():移除所有的鍵值對元素
               * V remove(Object key):根據鍵刪除鍵值對元素,并把值返回
               */
              
              Integer i1 = map.remove("小王");
              Integer i2 = map.remove("小李");
              
              System.out.println(i1);
              System.out.println(i2);
              
              System.out.println("刪除后,集合中元素有:");
              System.out.println(map);
              
              /*
               * 在JDK1.8中輸出結果為:
               * ---------------------------------
               * ====V remove(Object key):====
                  23
                  22
                  刪除后,集合中元素有:
                  {小明=25, 小花=24}
                ---------------------------------
               * */       
          }
          
          public static void testBoolean(Map<String,Integer> map) {
              /*
               * c:判斷功能
               *
               * boolean containsKey(Object key):判斷集合是否包含指定的鍵
               * boolean containsValue(Object value):判斷集合是否包含指定的值
               * boolean isEmpty():判斷集合是否為空
              */
              
              System.out.println("Map集合是否為空?" + map.isEmpty());
              System.out.println("Map集合是否包含指定的鍵“小花? " + map.containsKey("小花"));
              System.out.println("Map集合是否包含指定的值:28  " + map.containsValue(28));
              
              /*
               *  在JDK1.8中輸出結果為:
               *  ---------------------------------------
               *  ==============判斷功能==============
                  Map集合是否為空?false
                  Map集合是否包含指定的鍵“小花? true
                  Map集合是否包含指定的值:28  false
                  --------------------------------------- 
               * */
          }
          
          public static void testSize(Map<String,Integer> map) {
              System.out.println("Map中鍵值對個數為: "  + map.size()); 
              
              /*
               * 在JDK1.8中輸出結果為:
               * ---------------------------------------
               * ==========e:長度功能 int size()==========
                 Map中鍵值對個數為: 2
                 ---------------------------------------
               * */
          }
      }
    

三、集合框架(Map集合的遍歷之鍵找值)

  1. 鍵找值思路:

    • 獲取所有鍵的集合

      • Set<K> keySet()——返回所有鍵的集合
    • 遍歷鍵的集合,獲取到每一個鍵

      • Set集合中的iterator方法
    • 根據鍵找值

      • V get(Object key)
  2. 程序——Map集合的遍歷之鍵找值

     public static void main(String[] args) {
         Map<String,Integer> map = new HashMap<>();
         
         map.put("小王", 21);
         map.put("小李", 22);
         map.put("小花", 24);
         map.put("小明", 25);
         
         //獲取所有鍵
         Set<String> set = map.keySet();
         
         //獲取迭代器
         Iterator<String> i = set.iterator();
         
         //遍歷輸出所有鍵
         while(i.hasNext()) {
             String key = i.next();
             System.out.println("key = " + key + " value = " + map.get(key));
         }
     
         //增強的for循壞輸出鍵值對
         /*
         for(String key : map.keySet()) {
             System.out.println("key = " + key + " value = " + map.get(key));
         }*/
     }
    

四、集合框架(Map集合的遍歷之鍵值對對象找鍵和值)

  1. 鍵值對對象找鍵和值思路:、

    • 獲取所有鍵值對對象的集合——entrySet方法返回Map.Entry類型

      • 將所有的Map.Entry對象放在Set集合中
* 遍歷鍵值對對象的集合,獲取到每一個鍵值對對象

    * Set接口中的iterator方法遍歷出每一個Map.Entry對象

* 根據鍵值對對象找鍵和值

    * 利用Map.Entry接口中的getKey()和getValue方法獲取鍵和值
  1. 案例演示
    • Map集合的遍歷之鍵值對對象找鍵和值

        public class TestIterator_3 {
            public static void main(String[] args) {
                Map<String,Integer> map = new HashMap<>();
                
                map.put("小王", 21);
                map.put("小李", 22);
                map.put("小花", 24);
                map.put("小明", 25);
                
                /*//Map.Entry說明Entry是Map的內部接口
                //將鍵和值封裝成Entry對象,并存儲在Set集合中
                Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
                
                //獲取每一個對象
                Iterator<Map.Entry<String, Integer>> i = entrySet.iterator();
                
                while(i.hasNext()) {
                    
                    Map.Entry<String,Integer> me = i.next();
                    System.out.println("key = " + me.getKey() + "value  = " + me.getValue());
                }*/
                
                for(Map.Entry<String, Integer> e : map.entrySet()) {
                    System.out.println("key = " + e.getKey() + "value  = " + e.getValue());
                }
            }
        }
        /*
         *   在JDK1.8中輸出結果為:
         *  -----------------------
         *  key = 小李value  = 22
            key = 小明value  = 25
            key = 小王value  = 21
            key = 小花value  = 24
            ------------------------
         * */
      

五、HashMap

  • 類似于HashSet對鍵唯一的要求

    • 在自定義類型的時候,一定要重寫HashCode和equals方法

六、LinkedHashMap

  • 鏈表實現:可保證怎么存就怎么取

七、TreeMap

  • 自定義對象必須實現Comparable接口或者Comparator接口

    • 自定義對象若實現Comparable接口,則必須重寫compareTo方法

    • 自定義對象若實現Comparator接口,則必須重寫compare方法

八、集合框架(統計字符串中每個字符出現的次數)

  • 需求:統計字符串中每個字符出現的次數

  • 分析

    1. 從鍵盤獲取字符串輸入,將字符串轉換為字符數組
    2. 創建HashMap集合,將字符串中的字符作為key存入到HashMap中
    3. 當該字符包含在HashMap中時,則增加value
    4. 遍歷HashMap輸出字符串中每一個字符出現的次數
  • 程序

      public class TestMap_2 {
          public static void main(String[] args) {
              //1. 從鍵盤獲取字符串輸入,將字符串轉換為字符數組
              Scanner input = new Scanner(System.in);
              
              System.out.println("請輸入要統計的字符串");
              String string = input.nextLine();
              
              char[] charArr = string.toCharArray();
              
              //2. 創建HashMap集合,將字符串中的字符作為key存入到HashMap中
              HashMap<Character, Integer> hashMap = new HashMap<>();
              
              //3. 當該字符包含在HashMap中時,則增加value
              for(char c : charArr) {
                  /*
                  if(hashMap.containsKey(c)) {
                      //增加value
                      hashMap.put(c,hashMap.get(c) + 1);
                  }
                  else {
                      hashMap.put(c,1);
                  }
                  */
                  //上段代碼也等價于
                  hashMap.put(c, hashMap.containsKey(c) ? hashMap.get(c) + 1 : 1);
              }
              
              //4. 遍歷HashMap輸出字符串中每一個字符出現的次數
              //在這兒我們使用通過鍵值對象獲取鍵和值
              
              Set<Map.Entry<Character, Integer>> set = hashMap.entrySet();
              
              //獲取set的迭代器
              Iterator<Map.Entry<Character, Integer>> iterator = set.iterator();
              
              //遍歷輸出鍵和值
              while(iterator.hasNext()) {
                  //獲取Entry對象
                  Entry<Character, Integer> entry = iterator.next();
                  
                  System.out.println(entry.getKey() + "出現的次數為:" + entry.getValue());
              }
          }
      }
      /*
       *  在JDK1.8中輸出結果為:
       *  ----------------
       *  請輸入要統計的字符串
          aaaabbbbbcc
          a出現的次數為:4
          b出現的次數為:5
          c出現的次數為:2
          ----------------
       * */
    

九、集合框架(HashMap和Hashtable的區別)

  • A:面試題

    • HashMap和Hashtable相同點

      • 底層實現都是哈希算法,都是雙列集合
    • HashMap和Hashtable的區別

      • Hashtable是JDK1.0版本出現的,是線程安全的,效率低,HashMap是JDK1.2版本出現的,是線程不安全的,效率高

      • Hashtable不可以存儲null鍵和null值,HashMap可以存儲null鍵和null值

十、集合框架(Collections工具類的概述和常見方法講解)

  • A:Collections類概述

    • 針對集合操作 的工具類
  • B:Collections成員方法

      public static <T> void sort(List<T> 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)
    

十一、集合框架(模擬斗地主洗牌和發牌)

  • 模擬斗地主洗牌和發牌

  • 程序

      //買一副牌
      String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
      String[] color = {"方片","梅花","紅桃","黑桃"};
      HashMap<Integer, String> hm = new HashMap<>();          //存儲索引和撲克牌
      ArrayList<Integer> list = new ArrayList<>();            //存儲索引
      int index = 0;                                          //索引的開始值
      for(String s1 : num) {
          for(String s2 : color) {
              hm.put(index, s2.concat(s1));                   //將索引和撲克牌添加到HashMap中
              list.add(index);                                //將索引添加到ArrayList集合中
              index++;
          }
      }
      hm.put(index, "小王");
      list.add(index);
      index++;
      hm.put(index, "大王");
      list.add(index);
      //洗牌
      Collections.shuffle(list);
      //發牌
      TreeSet<Integer> gaojin = new TreeSet<>();
      TreeSet<Integer> longwu = new TreeSet<>();
      TreeSet<Integer> me = new TreeSet<>();
      TreeSet<Integer> dipai = new TreeSet<>();
      
      for(int i = 0; i < list.size(); i++) {
          if(i >= list.size() - 3) {
              dipai.add(list.get(i));                         //將list集合中的索引添加到TreeSet集合中會自動排序
          }else if(i % 3 == 0) {
              gaojin.add(list.get(i));
          }else if(i % 3 == 1) {
              longwu.add(list.get(i));
          }else {
              me.add(list.get(i));
          }
      }
      
      //看牌
      lookPoker("高進", gaojin, hm);
      lookPoker("龍五", longwu, hm);
      lookPoker("馮佳", me, hm);
      lookPoker("底牌", dipai, hm);     
    

    }

    public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer, String> hm) {
    System.out.print(name + "的牌是:");
    for (Integer index : ts) {
    System.out.print(hm.get(index) + " ");
    }
    System.out.println();
    }

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 其實,我的愿望很低很小, 我只想做成一棵樹, 安靜地佇立在三亞,在亞龍灣。 晴天, 我撫摸陽光,仰望藍天和白云。 ...
    青島老黃閱讀 350評論 1 3
  • 7月30日 23:32嗚嗚嗚嗚嗚嗚嗚求之不得真的是最大的虐點……總感覺……像周泰這樣的人,出身低微,又不夠聰明,所...
    洞庭府君閱讀 916評論 2 10
  • 丘巒風息寂無言,古木垂臂安綠蔭。 草吐芳馨蠅飛舞,花閃銀蓽予獨傾。 伊人熠熠鎏金閃,我惟初醒唱杜鵑。 茵夢去來無處...
    表觀奇跡閱讀 595評論 0 2
  • 程菲菲茫然的走在大街上,她不知道該去哪里,也不知道自己能去哪里,就是這樣茫然的走著,孤獨而無助。 該怎么辦呢,該怎...
    曼曼語閱讀 287評論 4 0