Java那點兒事之Map集合不為人知的秘密有哪些

前言

上期我們說到瞭Collection集合,他是單列的集合,分為List集合和Set集合,今天我將繼續分析一個雙列集合也就是Map,為什麼叫他雙列集合呢? 往下看,你就知道瞭。

一、Map

Map集合的特點
– 鍵值對映射關系
– 一個鍵對應一個值
– 鍵不能重復,值可以重復
– 元素存取無序

我們通過他的一個實現類HashMap集合來理解

二、HashMap的基本概念

HashMap的定義:

HashMap 是一個散列表,它存儲的內容是鍵值對(key-value)映射。

HashMap 實現瞭 Map 接口,根據鍵的 HashCode 值存儲數據,具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持線程同步。

HashMap 是無序的,即不會記錄插入的順序。

HashMap 繼承於AbstractMap,實現瞭 Map、Cloneable、java.io.Serializable 接口。

那麼HashMap的鍵和值的類型可以是String類型,也可以是其他數據的包裝類類型,那麼說到包裝類類型,這裡順便幫大傢復習一下包裝類類型哦:

三、HashMap集合的基本方法與使用

學完HashMap集合的基本概念,那麼我們怎麼去在實際開發過程中去使用他呢?這裡我們就要用到他的特有方法瞭,

以下是HashMap集合的常用方法

需要註意的是,Map集合的元素的添加並不是Collection集合的add()方法,而是Put()方法。因為Map集合是鍵值對集合,那麼我們如何獲取集合中的每一個元素呢?這裡集合也給我們提供瞭他的元素獲取方法:

示例代碼如下:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
/*
    Map集合的獲取功能:
        V get(Object key):根據鍵獲取值
        Set<K> keySet():獲取所有鍵的集合
        Collection<V> values():獲取所有值的集合
 */
public class MapDemo03 {
    public static void main(String[] args) {
        Map<String, String> m = new HashMap<String, String>();
 
        m.put("張三", "李四");
        m.put("王五", "趙六");
        m.put("李老板", "光頭強");
        // V get(Object key):根據鍵獲取值
        System.out.println(m.get("張三"));
 
        System.out.println(m.get("張四"));
        System.out.println("=============");
 
        //        Set<K> keySet():獲取所有鍵的集合
        Set<String> s = m.keySet();
        for (String i : s) {
            System.out.println(i);
        }
        System.out.println("=============");
 
        //        Collection<V> values():獲取所有值的集合
        Collection<String> c = m.values();
        for (String x : c) {
            System.out.println(x);
        }
    }
}

輸出結果:

李四
null
=============
張三
王五
李老板
=============
李四
趙六
光頭強

四、HashMap集合的遍歷

其實遍歷無非就是把集合中的元素一個一個給取出來,我們能用,那麼在第三部分其實就已經講到瞭一種遍歷方式,那就是我們去獲取鍵的集合,然後用循環去獲取每一個鍵所對應的值,這樣我們就將集合中的每一個元素取出來瞭。

遍歷方式一:根據鍵的集合找值

步驟分析
– 獲取所有鍵的集合。用keySet()方法實現
– 遍歷鍵的集合,獲取到每一個鍵。用增強for實現
– 根據鍵去找值。用get(Object key)方法實現

代碼實現

import java.util.Map;
import java.util.HashMap;
import java.util.Set;
 
/*
    Map集合的遍歷(方式1):
        1:獲取所有鍵的集合。用keySet()方法實現
        2:遍歷鍵的集合,獲取到每一個鍵。用增強for實現
        3:根據鍵去找值。用get(Object key)方法實現
 */
public class MapDemo01 {
    public static void main(String[] args) {
        //創建集合對象
        Map<String, String> map = new HashMap<String, String>();
 
        //添加元素
        map.put("張無忌", "趙敏");
        map.put("郭靖", "黃蓉");
        map.put("楊過", "小龍女");
        //1:獲取所有鍵的集合。用keySet()方法實現
        Set<String> keySet = map.keySet();
 
        for (String key : keySet) {
            String value = map.get(key);
            System.out.println(key + "," + value);
        }
 
    }
}

輸出結果:

楊過,小龍女
郭靖,黃蓉
張無忌,趙敏

那麼第二種方法就是我們利用entrySet()方法來獲取集合中所有的鍵值對集合,然後去獲取所對的鍵或值。

HashMap集合遍歷方式二:鍵值對集合找鍵值對

步驟分析
– 獲取所有鍵值對對象的集合
– Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對對象的集合
– 遍歷鍵值對對象的集合,得到每一個鍵值對對象
– 用增強for實現,得到每一個Map.Entry
– 根據鍵值對對象獲取鍵和值
– 用getKey()得到鍵
– 用getValue()得到值

代碼實現

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
 
/*
    Map集合的遍歷(方式2):
        1:獲取所有鍵值對對象的集合
            Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對對象的集合
        2:遍歷鍵值對對象的集合,得到每一個鍵值對對象
            用增強for實現,得到每一個Map.Entry
        3:根據鍵值對對象獲取鍵和值
            用getKey()得到鍵
            用getValue()得到值
 */
public class MapDemo02 {
    public static void main(String[] args) {
        //創建集合對象
        Map<String, String> map = new HashMap<String, String>();
 
        //添加元素
        map.put("張無忌", "趙敏");
        map.put("郭靖", "黃蓉");
        map.put("楊過", "小龍女");
 
        //1:獲取所有鍵值對對象的集合
        Set<Map.Entry<String, String>> me = map.entrySet();
 
//        遍歷鍵值對對象的集合,得到每一個鍵值對對象
        for (Map.Entry<String, String> e : me) {
            String key = e.getKey();
            String value = e.getValue();
            System.out.println(key + "," + value);
        }
 
    }
}

輸出結果:

楊過,小龍女
郭靖,黃蓉
張無忌,趙敏

兩種遍歷方式都是很實用,各位大佬在開發中願意用哪種都是可以的哦。

五、HashMap集合的綜合案例

有道是:與其臨淵羨魚,不如退而結網。看瞭那麼 多理論的東西不自己動手去實踐一下,那麼魚兒永遠在魚塘,知識永遠在電腦裡,接下來就讓我們一起動手做一道題,來加深一下印象。

案例需求:

案例需求
– 鍵盤錄入一個字符串,要求統計字符串中每個字符串出現的次數。
– 舉例:鍵盤錄入“aababcabcdabcde” 在控制臺輸出:“a(5)b(4)c(3)d(2)e(1)”

思路解析:

1:鍵盤錄入一個字符串
2:創建HashMap集合,鍵是Character,值是Integer
3:遍歷字符串,得到每一個字符
4:拿得到的每一個字符作為鍵到HashMap集合中去找對應的值,看其返回值
如果返回值是null:說明該字符在HashMap集合中不存在,就把該字符作為鍵,1作為值存儲
如果返回值不是null:說明該字符在HashMap集合中存在,把該值加1,然後重新存儲該字符和對應的值
5:遍歷HashMap集合,得到鍵和值,按照要求進行拼接
6:輸出結果

代碼實例:

import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
 
/*
    需求:
        鍵盤錄入一個字符串,要求統計字符串中每個字符串出現的次數。
        舉例:鍵盤錄入“aababcabcdabcde”	在控制臺輸出:“a(5)b(4)c(3)d(2)e(1)”
    思路:
        1:鍵盤錄入一個字符串
        2:創建HashMap集合,鍵是Character,值是Integer
        3:遍歷字符串,得到每一個字符
        4:拿得到的每一個字符作為鍵到HashMap集合中去找對應的值,看其返回值
            如果返回值是null:說明該字符在HashMap集合中不存在,就把該字符作為鍵,1作為值存儲
            如果返回值不是null:說明該字符在HashMap集合中存在,把該值加1,然後重新存儲該字符和對應的值
        5:遍歷HashMap集合,得到鍵和值,按照要求進行拼接
        6:輸出結果
 */
public class HashMapDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入一個字符串:");
        String s = sc.nextLine();
 
        HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
 
        for (int i = 0; i < s.length(); i++) {
            char key = s.charAt(i);
 
            Integer value = hm.get(key);
            if (value == null) {
                hm.put(key, 1);
 
            } else {
                value++;
                hm.put(key, value);
            }
        }
 
        StringBuilder sb = new StringBuilder();
 
        Set<Character> keySet = hm.keySet();
        for (Character key1 : keySet) {
            Integer values = hm.get(key1);
            sb.append(key1).append("(").append(values).append(")");
        }
        String result = sb.toString();
        System.out.println(result);
    }
}

輸出結果:

請輸入一個字符串:
aababcabcdabcde
a(5)b(4)c(3)d(2)e(1)

六、總結

學習集合就應該仔細去瞭解其特有方法,並註意區分,多實踐才能加深明白其中用法,並且應該結合以前學習的知識去理解,可能會有意向不到的收獲哦。本期分享到這裡結束瞭,結合上期食用更佳哦,下期再見!

到此這篇關於Java那點兒事之Map集合不為人知的秘密有哪些的文章就介紹到這瞭,更多相關Java Map集合內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: