7月25號_Map集合

Map

今天的主要內(nèi)容

  • Map接口概述

  • Map集合的兩種遍歷方式

    • 通過鍵找值keySet

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

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

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

  • TreeMap

    • 統(tǒng)計字符串中每個字符出現(xiàn)的次數(shù)
  • HashMap和Hashtable的區(qū)別

    • 線程安全方面

    • 存儲鍵值對的數(shù)據(jù)類型方面

一、集合框架(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集合的數(shù)據(jù)結構值針對鍵有效,跟值無關;Collection集合的數(shù)據(jù)結構是針對元素有效

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

  • A:Map集合的功能概述

    • a:添加功能

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

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

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

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

    • b:刪除功能

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

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

    • c:判斷功能

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

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

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

    • d:獲取功能

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

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

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

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

    • e:長度功能

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

      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):根據(jù)鍵刪除鍵值對元素,并把值返回
               */
              
              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中鍵值對個數(shù)為: "  + map.size()); 
              
              /*
               * 在JDK1.8中輸出結果為:
               * ---------------------------------------
               * ==========e:長度功能 int size()==========
                 Map中鍵值對個數(shù)為: 2
                 ---------------------------------------
               * */
          }
      }
    

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

  1. 鍵找值思路:

    • 獲取所有鍵的集合

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

      • Set集合中的iterator方法
    • 根據(jù)鍵找值

      • 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對象

* 根據(jù)鍵值對對象找鍵和值

    * 利用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的內(nèi)部接口
                //將鍵和值封裝成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

  • 鏈表實現(xiàn):可保證怎么存就怎么取

七、TreeMap

  • 自定義對象必須實現(xiàn)Comparable接口或者Comparator接口

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

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

八、集合框架(統(tǒng)計字符串中每個字符出現(xiàn)的次數(shù))

  • 需求:統(tǒng)計字符串中每個字符出現(xiàn)的次數(shù)

  • 分析

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

      public class TestMap_2 {
          public static void main(String[] args) {
              //1. 從鍵盤獲取字符串輸入,將字符串轉(zhuǎn)換為字符數(shù)組
              Scanner input = new Scanner(System.in);
              
              System.out.println("請輸入要統(tǒng)計的字符串");
              String string = input.nextLine();
              
              char[] charArr = string.toCharArray();
              
              //2. 創(chuàng)建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輸出字符串中每一個字符出現(xiàn)的次數(shù)
              //在這兒我們使用通過鍵值對象獲取鍵和值
              
              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() + "出現(xiàn)的次數(shù)為:" + entry.getValue());
              }
          }
      }
      /*
       *  在JDK1.8中輸出結果為:
       *  ----------------
       *  請輸入要統(tǒng)計的字符串
          aaaabbbbbcc
          a出現(xiàn)的次數(shù)為:4
          b出現(xiàn)的次數(shù)為:5
          c出現(xiàn)的次數(shù)為:2
          ----------------
       * */
    

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

  • A:面試題

    • HashMap和Hashtable相同點

      • 底層實現(xiàn)都是哈希算法,都是雙列集合
    • HashMap和Hashtable的區(qū)別

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

      • 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)
    

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

  • 模擬斗地主洗牌和發(fā)牌

  • 程序

      //買一副牌
      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);
      //發(fā)牌
      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();
    }

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,367評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,001評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,213評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,535評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,317評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,868評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,963評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,090評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,599評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,549評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,712評論 1 367
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,233評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,961評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,353評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,607評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,321評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,686評論 2 370

推薦閱讀更多精彩內(nèi)容

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