Java那點(diǎn)兒事之Map集合不為人知的秘密有哪些
前言
上期我們說到了Collection集合,他是單列的集合,分為List集合和Set集合,今天我將繼續(xù)分析一個(gè)雙列集合也就是Map,為什么叫他雙列集合呢? 往下看,你就知道了。
一、Map
Map集合的特點(diǎn)
- 鍵值對映射關(guān)系
- 一個(gè)鍵對應(yīng)一個(gè)值
- 鍵不能重復(fù),值可以重復(fù)
- 元素存取無序
我們通過他的一個(gè)實(shí)現(xiàn)類HashMap集合來理解
二、HashMap的基本概念
HashMap的定義:
HashMap 是一個(gè)散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。
HashMap 實(shí)現(xiàn)了 Map 接口,根據(jù)鍵的 HashCode 值存儲數(shù)據(jù),具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持線程同步。
HashMap 是無序的,即不會(huì)記錄插入的順序。
HashMap 繼承于AbstractMap,實(shí)現(xiàn)了 Map、Cloneable、java.io.Serializable 接口。
那么HashMap的鍵和值的類型可以是String類型,也可以是其他數(shù)據(jù)的包裝類類型,那么說到包裝類類型,這里順便幫大家復(fù)習(xí)一下包裝類類型哦:
三、HashMap集合的基本方法與使用
學(xué)完HashMap集合的基本概念,那么我們怎么去在實(shí)際開發(fā)過程中去使用他呢?這里我們就要用到他的特有方法了,
以下是HashMap集合的常用方法
需要注意的是,Map集合的元素的添加并不是Collection集合的add()方法,而是Put()方法。因?yàn)镸ap集合是鍵值對集合,那么我們?nèi)绾潍@取集合中的每一個(gè)元素呢?這里集合也給我們提供了他的元素獲取方法:
示例代碼如下:
import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; /* Map集合的獲取功能: V get(Object key):根據(jù)鍵獲取值 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("李老板", "光頭強(qiáng)"); // V get(Object key):根據(jù)鍵獲取值 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); } } }
輸出結(jié)果:
李四
null
=============
張三
王五
李老板
=============
李四
趙六
光頭強(qiáng)
四、HashMap集合的遍歷
其實(shí)遍歷無非就是把集合中的元素一個(gè)一個(gè)給取出來,我們能用,那么在第三部分其實(shí)就已經(jīng)講到了一種遍歷方式,那就是我們?nèi)カ@取鍵的集合,然后用循環(huán)去獲取每一個(gè)鍵所對應(yīng)的值,這樣我們就將集合中的每一個(gè)元素取出來了。
遍歷方式一:根據(jù)鍵的集合找值
步驟分析
- 獲取所有鍵的集合。用keySet()方法實(shí)現(xiàn)
- 遍歷鍵的集合,獲取到每一個(gè)鍵。用增強(qiáng)for實(shí)現(xiàn)
- 根據(jù)鍵去找值。用get(Object key)方法實(shí)現(xiàn)
代碼實(shí)現(xiàn)
import java.util.Map; import java.util.HashMap; import java.util.Set; /* Map集合的遍歷(方式1): 1:獲取所有鍵的集合。用keySet()方法實(shí)現(xiàn) 2:遍歷鍵的集合,獲取到每一個(gè)鍵。用增強(qiáng)for實(shí)現(xiàn) 3:根據(jù)鍵去找值。用get(Object key)方法實(shí)現(xiàn) */ public class MapDemo01 { public static void main(String[] args) { //創(chuàng)建集合對象 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("張無忌", "趙敏"); map.put("郭靖", "黃蓉"); map.put("楊過", "小龍女"); //1:獲取所有鍵的集合。用keySet()方法實(shí)現(xiàn) Set<String> keySet = map.keySet(); for (String key : keySet) { String value = map.get(key); System.out.println(key + "," + value); } } }
輸出結(jié)果:
楊過,小龍女
郭靖,黃蓉
張無忌,趙敏
那么第二種方法就是我們利用entrySet()方法來獲取集合中所有的鍵值對集合,然后去獲取所對的鍵或值。
HashMap集合遍歷方式二:鍵值對集合找鍵值對
步驟分析
- 獲取所有鍵值對對象的集合
- Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對對象的集合
- 遍歷鍵值對對象的集合,得到每一個(gè)鍵值對對象
- 用增強(qiáng)for實(shí)現(xiàn),得到每一個(gè)Map.Entry
- 根據(jù)鍵值對對象獲取鍵和值
- 用getKey()得到鍵
- 用getValue()得到值
代碼實(shí)現(xiàn)
import java.util.HashMap; import java.util.Map; import java.util.Set; /* Map集合的遍歷(方式2): 1:獲取所有鍵值對對象的集合 Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對對象的集合 2:遍歷鍵值對對象的集合,得到每一個(gè)鍵值對對象 用增強(qiáng)for實(shí)現(xiàn),得到每一個(gè)Map.Entry 3:根據(jù)鍵值對對象獲取鍵和值 用getKey()得到鍵 用getValue()得到值 */ public class MapDemo02 { public static void main(String[] args) { //創(chuàng)建集合對象 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("張無忌", "趙敏"); map.put("郭靖", "黃蓉"); map.put("楊過", "小龍女"); //1:獲取所有鍵值對對象的集合 Set<Map.Entry<String, String>> me = map.entrySet(); // 遍歷鍵值對對象的集合,得到每一個(gè)鍵值對對象 for (Map.Entry<String, String> e : me) { String key = e.getKey(); String value = e.getValue(); System.out.println(key + "," + value); } } }
輸出結(jié)果:
楊過,小龍女
郭靖,黃蓉
張無忌,趙敏
兩種遍歷方式都是很實(shí)用,各位大佬在開發(fā)中愿意用哪種都是可以的哦。
五、HashMap集合的綜合案例
有道是:與其臨淵羨魚,不如退而結(jié)網(wǎng)。看了那么 多理論的東西不自己動(dòng)手去實(shí)踐一下,那么魚兒永遠(yuǎn)在魚塘,知識永遠(yuǎn)在電腦里,接下來就讓我們一起動(dòng)手做一道題,來加深一下印象。
案例需求:
案例需求
- 鍵盤錄入一個(gè)字符串,要求統(tǒng)計(jì)字符串中每個(gè)字符串出現(xiàn)的次數(shù)。
- 舉例:鍵盤錄入“aababcabcdabcde” 在控制臺輸出:“a(5)b(4)c(3)d(2)e(1)”
思路解析:
1:鍵盤錄入一個(gè)字符串
2:創(chuàng)建HashMap集合,鍵是Character,值是Integer
3:遍歷字符串,得到每一個(gè)字符
4:拿得到的每一個(gè)字符作為鍵到HashMap集合中去找對應(yīng)的值,看其返回值
如果返回值是null:說明該字符在HashMap集合中不存在,就把該字符作為鍵,1作為值存儲
如果返回值不是null:說明該字符在HashMap集合中存在,把該值加1,然后重新存儲該字符和對應(yīng)的值
5:遍歷HashMap集合,得到鍵和值,按照要求進(jìn)行拼接
6:輸出結(jié)果
代碼實(shí)例:
import java.util.HashMap; import java.util.Scanner; import java.util.Set; /* 需求: 鍵盤錄入一個(gè)字符串,要求統(tǒng)計(jì)字符串中每個(gè)字符串出現(xiàn)的次數(shù)。 舉例:鍵盤錄入“aababcabcdabcde” 在控制臺輸出:“a(5)b(4)c(3)d(2)e(1)” 思路: 1:鍵盤錄入一個(gè)字符串 2:創(chuàng)建HashMap集合,鍵是Character,值是Integer 3:遍歷字符串,得到每一個(gè)字符 4:拿得到的每一個(gè)字符作為鍵到HashMap集合中去找對應(yīng)的值,看其返回值 如果返回值是null:說明該字符在HashMap集合中不存在,就把該字符作為鍵,1作為值存儲 如果返回值不是null:說明該字符在HashMap集合中存在,把該值加1,然后重新存儲該字符和對應(yīng)的值 5:遍歷HashMap集合,得到鍵和值,按照要求進(jìn)行拼接 6:輸出結(jié)果 */ public class HashMapDemo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請輸入一個(gè)字符串:"); 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); } }
輸出結(jié)果:
請輸入一個(gè)字符串:
aababcabcdabcde
a(5)b(4)c(3)d(2)e(1)
六、總結(jié)
學(xué)習(xí)集合就應(yīng)該仔細(xì)去了解其特有方法,并注意區(qū)分,多實(shí)踐才能加深明白其中用法,并且應(yīng)該結(jié)合以前學(xué)習(xí)的知識去理解,可能會(huì)有意向不到的收獲哦。本期分享到這里結(jié)束了,結(jié)合上期食用更佳哦,下期再見!
到此這篇關(guān)于Java那點(diǎn)兒事之Map集合不為人知的秘密有哪些的文章就介紹到這了,更多相關(guān)Java Map集合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java反射機(jī)制的學(xué)習(xí)總結(jié)
總的來說,java反射機(jī)制是一個(gè)很好用的東西,用它可以解決很多死的東西,因?yàn)榉瓷錂C(jī)制的靈活行很大,有了他,我們就不要花太多的時(shí)間來寫操做數(shù)據(jù)庫的代碼了,而是方法更多的時(shí)間在項(xiàng)目的邏輯功能上,這個(gè)可以很大的減少開發(fā)時(shí)間,而且代碼的可讀性好2013-09-09java實(shí)現(xiàn)簡單銀行管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Java IO流和文件操作實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java IO流和文件操作實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10使用redisTemplate的scan方式刪除批量key問題
這篇文章主要介紹了使用redisTemplate的scan方式刪除批量key問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12SpringBoot指標(biāo)監(jiān)控功能實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot指標(biāo)監(jiān)控功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06idea的spring boot項(xiàng)目實(shí)現(xiàn)更改端口號操作
這篇文章主要介紹了idea的spring boot項(xiàng)目實(shí)現(xiàn)更改端口號操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09mybatis之調(diào)用帶輸出參數(shù)的存儲過程(Oracle)
這篇文章主要介紹了mybatis調(diào)用帶輸出參數(shù)的存儲過程(Oracle),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11手寫redis@Cacheable注解?支持過期時(shí)間設(shè)置方式
這篇文章主要介紹了手寫redis@Cacheable注解?支持過期時(shí)間設(shè)置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01java顯示當(dāng)前的系統(tǒng)時(shí)間
這篇文章主要介紹了java如何顯示當(dāng)前的系統(tǒng)時(shí)間,代碼很簡單,自己可以自定義顯示的系統(tǒng)時(shí)間的顏色和字體,需要的朋友可以參考下2015-10-10