7月25號(hào)_Map集合

Map

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

  • Map接口概述

  • Map集合的兩種遍歷方式

    • 通過(guò)鍵找值keySet

    • 通過(guò)鍵值對(duì)對(duì)象獲取鍵和值

      • 涉及到Map.Entry的認(rèn)識(shí)
  • HashMap

    • 自定義對(duì)象必須重寫(xiě)equals和hashCode方法
  • LinkedHashMap

  • TreeMap

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

    • 線程安全方面

    • 存儲(chǔ)鍵值對(duì)的數(shù)據(jù)類(lèi)型方面

一拒炎、集合框架(Map集合概述和特點(diǎn))

  1. Map接口概述

    • 查看API可以知道:

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

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

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

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

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

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

    • Map集合的數(shù)據(jù)結(jié)構(gòu)值針對(duì)鍵有效公条,跟值無(wú)關(guān);Collection集合的數(shù)據(jù)結(jié)構(gòu)是針對(duì)元素有效

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

  • A:Map集合的功能概述

    • a:添加功能

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

        • 如果鍵是第一次存儲(chǔ)粗恢,就直接存儲(chǔ)元素洲守,返回null

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

        • 相同的鍵不存儲(chǔ)喜滨,值覆蓋

    • b:刪除功能

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

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

    • 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:長(zhǎng)度功能

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

      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:長(zhǎng)度功能 int size()==========");
              testSize(map);
          }
          
          public static void testPut(Map<String,Integer> map) {
              /*
                  a:添加功能
                      V put(K key,V value):添加元素。
                      * 如果鍵是第一次存儲(chǔ)虽风,就直接存儲(chǔ)元素棒口,返回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中輸出結(jié)果為:
               *  -------------------------------
               *  ====V put(K key,V value):添加元素.====
                  {小李=22, 小明=25, 小王=23, 小花=24}
                  null        //返回null表示值沒(méi)有被覆蓋
                  null
                  21          //鍵相等无牵,值覆蓋,返回被覆蓋的值
                  null
                  null
               * -------------------------------
               * */
          }
          
          public static void testRemove(Map<String,Integer> map) {
              /*
               * b:刪除功能
               * void clear():移除所有的鍵值對(duì)元素
               * V remove(Object key):根據(jù)鍵刪除鍵值對(duì)元素厂抖,并把值返回
               */
              
              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中輸出結(jié)果為:
               * ---------------------------------
               * ====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中輸出結(jié)果為:
               *  ---------------------------------------
               *  ==============判斷功能==============
                  Map集合是否為空谭溉?false
                  Map集合是否包含指定的鍵“小花? true
                  Map集合是否包含指定的值:28  false
                  --------------------------------------- 
               * */
          }
          
          public static void testSize(Map<String,Integer> map) {
              System.out.println("Map中鍵值對(duì)個(gè)數(shù)為: "  + map.size()); 
              
              /*
               * 在JDK1.8中輸出結(jié)果為:
               * ---------------------------------------
               * ==========e:長(zhǎng)度功能 int size()==========
                 Map中鍵值對(duì)個(gè)數(shù)為: 2
                 ---------------------------------------
               * */
          }
      }
    

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

  1. 鍵找值思路:

    • 獲取所有鍵的集合

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

      • 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));
         }
     
         //增強(qiáng)的for循壞輸出鍵值對(duì)
         /*
         for(String key : map.keySet()) {
             System.out.println("key = " + key + " value = " + map.get(key));
         }*/
     }
    

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

  1. 鍵值對(duì)對(duì)象找鍵和值思路:碧库、

    • 獲取所有鍵值對(duì)對(duì)象的集合——entrySet方法返回Map.Entry類(lèi)型

      • 將所有的Map.Entry對(duì)象放在Set集合中
* 遍歷鍵值對(duì)對(duì)象的集合柜与,獲取到每一個(gè)鍵值對(duì)對(duì)象

    * Set接口中的iterator方法遍歷出每一個(gè)Map.Entry對(duì)象

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

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

        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說(shuō)明Entry是Map的內(nèi)部接口
                //將鍵和值封裝成Entry對(duì)象,并存儲(chǔ)在Set集合中
                Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
                
                //獲取每一個(gè)對(duì)象
                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中輸出結(jié)果為:
         *  -----------------------
         *  key = 小李value  = 22
            key = 小明value  = 25
            key = 小王value  = 21
            key = 小花value  = 24
            ------------------------
         * */
      

五嵌灰、HashMap

  • 類(lèi)似于HashSet對(duì)鍵唯一的要求

    • 在自定義類(lèi)型的時(shí)候旅挤,一定要重寫(xiě)HashCode和equals方法

六、LinkedHashMap

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

七伞鲫、TreeMap

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

    • 自定義對(duì)象若實(shí)現(xiàn)Comparable接口粘茄,則必須重寫(xiě)compareTo方法

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

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

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

  • 分析

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

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

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

  • A:面試題

    • HashMap和Hashtable相同點(diǎn)

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

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

      • Hashtable不可以存儲(chǔ)null鍵和null值,HashMap可以存儲(chǔ)null鍵和null值

十拐辽、集合框架(Collections工具類(lèi)的概述和常見(jiàn)方法講解)

  • A:Collections類(lèi)概述

    • 針對(duì)集合操作 的工具類(lèi)
  • 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ā)牌

  • 程序

      //買(mǎi)一副牌
      String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
      String[] color = {"方片","梅花","紅桃","黑桃"};
      HashMap<Integer, String> hm = new HashMap<>();          //存儲(chǔ)索引和撲克牌
      ArrayList<Integer> list = new ArrayList<>();            //存儲(chǔ)索引
      int index = 0;                                          //索引的開(kāi)始值
      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集合中會(huì)自動(dòng)排序
          }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("高進(jìn)", 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();
    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市俱诸,隨后出現(xiàn)的幾起案子菠劝,更是在濱河造成了極大的恐慌,老刑警劉巖睁搭,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赶诊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡园骆,警方通過(guò)查閱死者的電腦和手機(jī)舔痪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锌唾,“玉大人锄码,你說(shuō)我怎么就攤上這事。” “怎么了巍耗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵秋麸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我炬太,道長(zhǎng)灸蟆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任亲族,我火速辦了婚禮炒考,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霎迫。我一直安慰自己斋枢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布知给。 她就那樣靜靜地躺著瓤帚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涩赢。 梳的紋絲不亂的頭發(fā)上戈次,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音筒扒,去河邊找鬼怯邪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛花墩,可吹牛的內(nèi)容都是我干的悬秉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼冰蘑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼和泌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起懂缕,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤允跑,失蹤者是張志新(化名)和其女友劉穎王凑,沒(méi)想到半個(gè)月后搪柑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡索烹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年工碾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片百姓。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渊额,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旬迹,我是刑警寧澤火惊,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站奔垦,受9級(jí)特大地震影響屹耐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椿猎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一惶岭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犯眠,春花似錦按灶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至量蕊,卻和暖如春羡亩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背危融。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工畏铆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吉殃。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓辞居,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛋勺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓦灶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法抱完,內(nèi)部類(lèi)的語(yǔ)法贼陶,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法巧娱,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,665評(píng)論 18 399
  • 其實(shí)碉怔,我的愿望很低很小, 我只想做成一棵樹(shù)禁添, 安靜地佇立在三亞撮胧,在亞龍灣。 晴天老翘, 我撫摸陽(yáng)光芹啥,仰望藍(lán)天和白云锻离。 ...
    青島老黃閱讀 343評(píng)論 1 3
  • 7月30日 23:32嗚嗚嗚嗚嗚嗚嗚求之不得真的是最大的虐點(diǎn)……總感覺(jué)……像周泰這樣的人,出身低微墓怀,又不夠聰明汽纠,所...
    洞庭府君閱讀 901評(píng)論 2 10
  • 丘巒風(fēng)息寂無(wú)言,古木垂臂安綠蔭傀履。 草吐芳馨蠅飛舞疏虫,花閃銀蓽予獨(dú)傾。 伊人熠熠鎏金閃啤呼,我惟初醒唱杜鵑卧秘。 茵夢(mèng)去來(lái)無(wú)處...
    表觀奇跡閱讀 582評(píng)論 0 2
  • 程菲菲茫然的走在大街上翅敌,她不知道該去哪里,也不知道自己能去哪里惕蹄,就是這樣茫然的走著蚯涮,孤獨(dú)而無(wú)助。 該怎么辦呢卖陵,該怎...
    曼曼語(yǔ)閱讀 280評(píng)論 4 0