Java 深入淺出掌握Map集合之雙列集合
前言
友友們,大家好哇!這一期我為大家?guī)黼p列集合(Map)的相關(guān)知識點(diǎn)講解,那么什么是雙列集合呢?Map集合就是采用了key-value鍵值對映射的方式進(jìn)行存儲。通俗的講,和查字典類似,查字典時,我們通過偏旁或筆畫等查詢漢字,集合里通過key找到對應(yīng)的value,用學(xué)生類來說,key相當(dāng)于學(xué)號,value對應(yīng)name。
Map集合
Map概述
Map是一種依照鍵(key)存儲元素的容器,鍵(key)很像下標(biāo),在List中下標(biāo)是整數(shù)。在Map中鍵(key)可以使任意類型的對象。Map中不能有重復(fù)的鍵(Key),每個鍵(key)都有一個對應(yīng)的值(value)。一個鍵(key)和它對應(yīng)的值構(gòu)成map集合中的一個元素。
Map特點(diǎn)
- 鍵值對應(yīng)關(guān)系
- 一個鍵對應(yīng)一個值
- 鍵不能重復(fù),值可以重復(fù)
- 元素存取無序
Map集合的功能
- 基本功能
public class MapDemo_01 { public static void main(String[] args) { //創(chuàng)建集合對象 Map<String,String> map = new HashMap<>(); //V put(K key,V value):添加元素 map.put("灰太狼","紅太狼"); map.put("喜羊羊","美羊羊"); map.put("扁嘴倫","暖羊羊"); //V remove(Object key):根據(jù)鍵刪除鍵值對元素 // System.out.println(map.remove("喜羊羊")); //沒有對應(yīng)的鍵,則返回null // System.out.println(map.remove("沸羊羊")); //void clear():移除所有的鍵值對元素 // map.clear(); //boolean containsKey(Object key):判斷集合是否包含指定的鍵 // System.out.println(map.containsKey("喜羊羊")); //包含返回true,反之false // System.out.println(map.containsKey("沸羊羊")); //boolean isEmpty():判斷集合是否為空 // System.out.println(map.isEmpty()); //int size():集合的長度,也就是集合中鍵值對的個數(shù) System.out.println(map.size()); System.out.println(map); } }
- 獲取功能
public class MapDemo_02 { public static void main(String[] args) { //創(chuàng)建集合對象 Map<String, String> map = new HashMap<>(); //添加元素 map.put("灰太狼", "紅太狼"); map.put("喜羊羊", "美羊羊"); map.put("扁嘴倫", "暖羊羊"); //V get(Object key):根據(jù)鍵獲取值 // System.out.println(map.get("灰太狼")); //Set<K> keySet():獲取所有鍵的集合 // Set<String> keySet = map.keySet(); // for(String key : keySet) { // System.out.println(key); // } //Collection<V> values():獲取所有值的集合 Collection<String> values = map.values(); for(String value : values) { System.out.println(value); } } }
Map集合的遍歷
方式一:
- 1)獲取所有鍵的集合。用keySet()方法實(shí)現(xiàn)
- 2)遍歷鍵的集合,獲取到每一個鍵。用增強(qiáng)for實(shí)現(xiàn)
- 3)根據(jù)鍵去找值。用get(Object key)方法實(shí)現(xiàn)
public class MapDemo_03 { public static void main(String[] args) { //創(chuàng)建集合對象 Map<String, String> map = new HashMap<String, String>(); //添加元素 map.put("灰太狼", "紅太狼"); map.put("喜羊羊", "美羊羊"); map.put("扁嘴倫", "暖羊羊"); //獲取所有鍵的集合。用keySet()方法實(shí)現(xiàn) Set<String> keySet = map.keySet(); //遍歷鍵的集合,獲取到每一個鍵。用增強(qiáng)for實(shí)現(xiàn) for (String key : keySet) { //根據(jù)鍵去找值。用get(Object key)方法實(shí)現(xiàn) String value = map.get(key); System.out.println(key + "," + value); } } }
方式二:
- 1)獲取所有鍵值對對象的集合:Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對對象的集合
- 2)遍歷鍵值對對象的集合,得到每一個鍵值對對象:用增強(qiáng)for實(shí)現(xiàn),得到每一個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("扁嘴倫", "暖羊羊"); //獲取所有鍵值對對象的集合 Set<Map.Entry<String, String>> entrySet = map.entrySet(); //遍歷鍵值對對象的集合,得到每一個鍵值對對象 for (Map.Entry<String, String> me : entrySet) { //根據(jù)鍵值對對象獲取鍵和值 String key = me.getKey(); String value = me.getValue(); System.out.println(key + "," + value); } } }
Map集合的各個子類
- 1)Hashtable:
底層是哈希表數(shù)據(jù)結(jié)構(gòu),線程是同步的,不可以存入null鍵,null值。
效率較低,被HashMap 替代。
- 2)HashMap:(數(shù)據(jù)無序、唯一)
底層是哈希表數(shù)據(jù)結(jié)構(gòu),線程是不同步的,可以存入null鍵,null值。
要保證鍵的唯一性,需要覆蓋hashCode方法,和equals方法。
- 3)LinkedHashMap:(數(shù)據(jù)有序、唯一)
該子類基于哈希表又融入了鏈表??梢訫ap集合進(jìn)行增刪提高效率。
- 4)TreeMap:(數(shù)據(jù)有序、唯一)
底層是二叉樹數(shù)據(jù)結(jié)構(gòu)??梢詫ap集合中的鍵進(jìn)行排序。需要使用Comparable或者Comparator 進(jìn)行比較排序。return 0,來判斷鍵的唯一性。
集合框架圖
今天驗(yàn)收關(guān)卡的時候,老師針對集合這部分內(nèi)容,給出了一些補(bǔ)充知識與相關(guān)問題,我簡短總結(jié)了一下。
【1】ArrayList、LinkedList、Vector三者區(qū)別:
Vector:數(shù)組,線程安全
ArrayList:List子類,數(shù)據(jù)存取有序,可重復(fù);底層是數(shù)組結(jié)構(gòu)實(shí)現(xiàn),有索引,查詢快、增刪慢;線程不安全
LinkedList:List子類,數(shù)據(jù)存取有序,可重復(fù);底層是鏈表結(jié)構(gòu)實(shí)現(xiàn),指針,查詢慢、增刪快;線程不安全
【2】HashMap與HashTable區(qū)別:
1)底層數(shù)據(jù)結(jié)構(gòu)不同:HashTable只有數(shù)組+鏈表(JDK1就提出);HashMap在JDK1.8之前 數(shù)組+鏈表,在1.8之后 數(shù)組+鏈表/紅黑樹
2)初始化容量不同:HashMap 的初始容量為:16,Hashtable 初始容量為:11,兩者的負(fù)載因子默認(rèn)都是:0.75
3)擴(kuò)容機(jī)制不同:當(dāng)已用容量>總?cè)萘?* 負(fù)載因子時,HashMap 擴(kuò)容規(guī)則為當(dāng)前容量翻倍,Hashtable 擴(kuò)容規(guī)則為當(dāng)前容量翻倍 +1
4)Hashtable是不允許鍵或值為 null 的,HashMap 的鍵值則都可以為 null
【3】HashSet與TreeSet區(qū)別:
HashSet:
1)不能保證元素的排列順序,順序有可能發(fā)生變化
2)集合元素可以是null,但只能放入一個null
3)HashSet底層是采用HashMap實(shí)現(xiàn)的
4)HashSet底層是哈希表實(shí)現(xiàn)的
TreeSet:
1)Treeset中的數(shù)據(jù)是排好序的,不允許放入null值
2)TreeSet是通過TreeMap實(shí)現(xiàn)的,只不過Set用的只是Map的key
3)TreeSet的底層實(shí)現(xiàn)是采用二叉樹(紅-黑樹)的數(shù)據(jù)結(jié)構(gòu)
【4】Collection和Collections的區(qū)別:
Collection:
一個集合接口,它提供了對集合對象進(jìn)行基本操作的通用接口方法。實(shí)現(xiàn)接口的類主要有List和Set,該接口的設(shè)計(jì)目標(biāo)是為了各種具體的集合提供最大化的統(tǒng)一的操作方式
Collections:
針對集合類的一個包裹類,它提供了一系列靜態(tài)方法實(shí)現(xiàn)對各種集合的搜索、排序以及線程安全化等操作,其中的大多數(shù)方法都是用于處理線性表。Collections類不能實(shí)例化,如同一個工具類,服務(wù)于Collection框架。如果在使用Collections類的方法時,對應(yīng)的Collection對象null,則這些方法都會拋出NullPointerException
總結(jié)
本篇內(nèi)容給出的集合的各個子類之間的區(qū)別不怎么完善,想要拓展更多知識的同學(xué),可以自行查詢搜索一下,以便更深的認(rèn)識集合。今天的分享就到這里了,忘友友們可以點(diǎn)贊加評論哦,誠信回訪?。?!
以上就是Java 深入淺出掌握Map集合之雙列集合的詳細(xì)內(nèi)容,更多關(guān)于Java 集合的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Lombok 的@StandardException注解解析
@StandardException 是一個實(shí)驗(yàn)性的注解,添加到 Project Lombok 的 v__1.18.22 版本中,在本教程中,我們將使用 Lombok 的 @StandardException 注解自動生成異常類型類的構(gòu)造函數(shù),需要的朋友可以參考下2023-05-05Java中類與對象的相關(guān)知識點(diǎn)總結(jié)
對象是類實(shí)例化出來的,對象中含有類的屬性,類是對象的抽象,下面這篇文章主要給大家介紹了關(guān)于Java中類與對象的一些相關(guān)知識點(diǎn),需要的朋友可以參考下2021-11-11Java接口的作用_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java接口的作用,涉及到接口的規(guī)范相關(guān)知識,需要的的朋友參考下2017-04-04Java數(shù)據(jù)結(jié)構(gòu)與算法之選擇排序(動力節(jié)點(diǎn)java學(xué)院整理)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之選擇排序的相關(guān)資料,本文通過代碼講解,非常不錯,具有參考借鑒價值,需要的的朋友參考下2017-04-04SpringBoot中間件ORM框架實(shí)現(xiàn)案例詳解(Mybatis)
這篇文章主要介紹了SpringBoot中間件ORM框架實(shí)現(xiàn)案例詳解(Mybatis),本篇文章提煉出mybatis最經(jīng)典、最精簡、最核心的代碼設(shè)計(jì),來實(shí)現(xiàn)一個mini-mybatis,從而熟悉并掌握ORM框架的涉及實(shí)現(xiàn),需要的朋友可以參考下2023-07-07使用SpringCache操作Redis緩存數(shù)據(jù)的示例代碼
SpringCache是一個框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡單的加一個注解,就能實(shí)現(xiàn)緩存功能,本文給大家介紹了如何使用SpringCache操作Redis緩存數(shù)據(jù),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01