Java?Map雙列集合使代碼更高效
Map雙列集合
Map是一種雙列集合,一個(gè)元素包含兩個(gè)值,一個(gè)是Key,一個(gè)是Value。Map集合中的元素,key和value的數(shù)據(jù)類型可以相同,也可以不同。一個(gè)映射不能包含重復(fù)的鍵;每個(gè)鍵最多只能有一個(gè)值。
今天我們繼續(xù)探索Java集合的世界,這次我們要聊的主題是——雙列集合Map。
首先,讓我們來理解一下什么是雙列集合。在Java中,集合是一種用于存儲(chǔ)對(duì)象的容器,而雙列集合則是一種可以同時(shí)通過兩個(gè)鍵(Key)來訪問元素的集合。聽起來有些復(fù)雜?別擔(dān)心,接下來我會(huì)用最簡(jiǎn)單的語言,帶你走進(jìn)Map的世界。
概述
現(xiàn)實(shí)生活中,我們常會(huì)看到這樣的一種集合:IP地址與主機(jī)名,身份證號(hào)與個(gè)人,學(xué)號(hào)與學(xué)生等,這種一一對(duì)應(yīng)的關(guān)系,就叫做映射。Java提供了專門的集合類用來存放這種對(duì)象關(guān)系的對(duì)象,即java.util.Map接口。
Map 接口下的集合與Collection 接口下的集合,他們的存儲(chǔ)形式有所不同,如下圖:

Collection 集合,元素是獨(dú)立的,存儲(chǔ)的元素是一個(gè)一個(gè)的存儲(chǔ)。Map中的集合,元素是成對(duì)出現(xiàn)。每個(gè)元素由鍵與值兩部分組成,通過鍵可以找到所對(duì)應(yīng)的值。所以 我們前面所說 Collection是單列集合,而Map 成為雙列集合。
需要注意,Map中的鍵不能重復(fù),值可以重復(fù),并且每個(gè)鍵只能對(duì)應(yīng)一個(gè)值。
Map 常用子類
Map 接口也有很多子類,這里我們主要講解常用的HashMap集合,LinkedHashMap集合。

HashMap<K,V>: 存儲(chǔ)數(shù)據(jù)采用哈希表結(jié)構(gòu),元素的存取順序不能保證一致。
由于要保證鍵的唯一,不重復(fù),需要重寫鍵的hashCode()方法,equals()方法。我們之前所學(xué)的HashSet 底層,實(shí)際上也是new了一個(gè)HashMap,但是只是使用了 HashMap中的 K,所以HashSet是不允許重復(fù)值的。
LinkedHashMap<K,V>:HashMap下有個(gè)子類LinkedHashMap,存儲(chǔ)數(shù)據(jù)采用的哈希表結(jié)構(gòu)+鏈表結(jié)構(gòu)。
通過鏈表結(jié)構(gòu)可以保證元素的存取順序一致;通過哈希表結(jié)構(gòu)可以保證的鍵的唯一、不重復(fù),需要重寫鍵的hashCode()方法、equals()方法。
Set與Map之間的關(guān)系非常密切,從java 源碼來看,java是先實(shí)現(xiàn)了Map,然后通過包裝一個(gè)所有value都為null的Map,就實(shí)現(xiàn)了Set集合。
Map 接口中的常用方法
Map接口中定義了很多方法,常用的如下:
添加、刪除、修改操作
- Object put(Object key,Object value):將指定key-value添加到(或修改)當(dāng)前map對(duì)象中
- void putAll(Map m):將m中的所有key-value對(duì)存放到當(dāng)前map中
- Object remove(Object key):移除指定key的key-value對(duì),并返回value
void clear():清空當(dāng)前map中的所有數(shù)據(jù) public class Demo1Map {
public static void main(String[ ] args) {
// ○ Object put(Object key,Object value):將指定key-value添加到(或修 改)當(dāng)前map對(duì)象中
// ○ void putAll(Map m):將m中的所有key-value對(duì)存放到當(dāng)前map中
// ○ Object remove(Object key):移除指定key的key-value對(duì),并返回value
// ○ void clear():清空當(dāng)前map中的所有數(shù)據(jù)
//創(chuàng)建集合對(duì)象
Map<String, Student> studentMap = new HashMap<>();
//將對(duì)應(yīng)的對(duì)象放到map中
studentMap.put("N001", new Student("叮當(dāng)", 7));
studentMap.put("N002", new Student("糖糖", 7));
studentMap.put("N003", new Student("熙熙", 7));
//remove
studentMap.remove("N002");
System.out.println("remove==" + studentMap);
//put
studentMap.put("N004", new Student("狗蛋", 7));
System.out.println("put==" + studentMap);
//putAll 如果鍵重復(fù),會(huì)把原map中的節(jié)點(diǎn)替換
Map<String, Student> studentMap2 = new HashMap<>();
studentMap.put("N001", new Student("一一", 7));
studentMap.put("N002", new Student("陌陌", 7));
studentMap.putAll(studentMap2);
System.out.println("putAll == " + studentMap);
//clear
studentMap.clear();
System.out.println("clear == " + studentMap);
}
}元素查詢的操作
- Object get(Object key):獲取指定key對(duì)應(yīng)的value
- boolean containsKey(Object key):是否包含指定的key
- boolean containsValue(Object value):是否包含指定的value
- int size():返回map中key-value對(duì)的個(gè)數(shù)
- boolean isEmpty():判斷當(dāng)前map是否為空
boolean equals(Object obj):判斷當(dāng)前map和參數(shù)對(duì)象obj是否相等
public class Demo2Map {
public static void main(String[ ] args) {
//創(chuàng)建集合對(duì)象
Map<String, Student> studentMap = new HashMap<>();
//將對(duì)應(yīng)的對(duì)象放到map中
studentMap.put("N001", new Student("叮當(dāng)", 7));
studentMap.put("N002", new Student("糖糖", 7));
studentMap.put("N003", new Student("熙熙", 7));
//get
Student n001 = studentMap.get("N001");
System.out.println("001==" + n001 );
//containsKey
boolean isContainsKey = studentMap.containsKey("N002");
System.out.println("containsKey結(jié)果 == " + isContainsKey);
//containsValue
boolean containsValue = studentMap.containsValue(new Student("熙熙", 7));
System.out.println("containsValue結(jié)果 == " + containsValue);
//size
int size = studentMap.size();
System.out.println("size == "+ size);
//isEmpty
boolean isEmpty = studentMap.isEmpty();
System.out.println("isEmpty == " + isEmpty);
//equals
boolean equals = studentMap.get("N002").equals(new Student("糖糖", 7));
System.out.println("equals == " + equals);
}
}Map 集合遍歷
Map接口沒有繼承 接口 Iterable ,所以遍歷不能直接使用 迭代器和增強(qiáng)for循環(huán)。
那它如何遍歷呢? 我們知道,Map中存放的是兩種對(duì)象 Key對(duì)象 & Value對(duì)象,他們?cè)贛ap中是一一對(duì)應(yīng)的,這一對(duì)對(duì)象合起來在Map集中稱為 Entry 對(duì)象,也稱之為鍵值對(duì)象。
而我們?cè)诒闅vMap集合時(shí),就可以從每一個(gè)鍵值對(duì)對(duì)象中獲取對(duì)應(yīng)的鍵,然后找到對(duì)應(yīng)的值。
鍵找值方式
在Map 集合中,為我們提供了一個(gè)方法
- keySet() 獲取Map中所有的鍵,由于鍵是唯一的,所以返回一個(gè)Set集合存儲(chǔ)所有的鍵`。
那我們就可以遍歷這個(gè)Set集合,通過 Entry的方法 - public V getValue():獲取Entry對(duì)象中的Value值。
鍵值對(duì)方式
在Map集合中也提供了獲取所有Entry對(duì)象的方法:
public Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中所有的鍵值對(duì)對(duì)象的集合(Set集合)。
那我們就 可以通過這個(gè)方法,獲取Map集合中,所有的鍵值對(duì)(Entry)對(duì)象的 Set集合,然后遍歷包含Entry對(duì)象的Set集合,得到每一個(gè)Entry對(duì)象。通過鍵值對(duì)(Entry)對(duì)象,獲取Entry對(duì)象中的鍵與值。
方法提示:getkey() getValue()
public class Demo3Map {
public static void main(String[ ] args) {
//方法一:keySet遍歷key+value:
//創(chuàng)建集合對(duì)象
Map<String, Student> studentMap = new HashMap<>();
//將對(duì)應(yīng)的對(duì)象放到map中
studentMap.put("N001", new Student("叮當(dāng)", 7));
studentMap.put("N002", new Student("糖糖", 7));
studentMap.put("N003", new Student("熙熙", 7));
//獲取 map集合中的所有key
Set<String> strings = studentMap.keySet();
//遍歷 key的集合,通過get()獲取沒一個(gè)value
for (String key : strings) {
Student student = studentMap.get(key);
System.out.println("studentmap == key="+key+" value="+ student);
}
//方法二:entrySet遍歷key+value:
Set<Map.Entry<String, Student>> entries = studentMap.entrySet();
for (Map.Entry<String, Student> entry : entries) {
String key = entry.getKey();
Student value = entry.getValue();
System.out.println("studentmap 方式2 == key="+key+" value="+ value);
}
}
}Map在實(shí)際應(yīng)用中非常廣泛,例如在數(shù)據(jù)庫中存儲(chǔ)和查詢數(shù)據(jù)、在緩存中存儲(chǔ)和獲取數(shù)據(jù)、在處理用戶輸入和輸出時(shí)進(jìn)行轉(zhuǎn)換等。通過使用Map,我們可以更高效地處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)和業(yè)務(wù)邏輯。
總結(jié)
來說,Map是Java集合框架中的一個(gè)重要組成部分,它的強(qiáng)大功能和靈活應(yīng)用為我們的編程工作帶來了極大的便利。希望通過今天的學(xué)習(xí),你能對(duì)Map有一個(gè)更深入的理解,并能在實(shí)際編程中靈活運(yùn)用,更多關(guān)于Java Map雙列集合的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java?MongoDB實(shí)現(xiàn)列表分頁查詢的示例代碼
本文主要介紹了java?MongoDB實(shí)現(xiàn)列表分頁查詢的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
在SpringBoot+MyBatis中優(yōu)雅處理多表數(shù)據(jù)清洗的實(shí)現(xiàn)步驟
數(shù)據(jù)清洗是指對(duì)數(shù)據(jù)進(jìn)行處理和糾錯(cuò),以去除或修復(fù)數(shù)據(jù)集中存在的錯(cuò)誤、不致、不完整和冗余的數(shù)據(jù),從而使數(shù)據(jù)更加準(zhǔn)確、可靠和有用,本文給大家介紹了在SpringBoot和MyBatis中優(yōu)雅處理多表數(shù)據(jù)清洗的實(shí)現(xiàn)步驟,需要的朋友可以參考下2025-03-03
springboot jdbctemplate如何實(shí)現(xiàn)多數(shù)據(jù)源
這篇文章主要介紹了springboot jdbctemplate如何實(shí)現(xiàn)多數(shù)據(jù)源問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
使用MUI框架構(gòu)建App請(qǐng)求http接口實(shí)例代碼
下面小編就為大家分享一篇使用MUI框架構(gòu)建App請(qǐng)求http接口實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
SpringBoot實(shí)現(xiàn)定時(shí)發(fā)送郵件的三種方法案例詳解
這篇文章主要介紹了SpringBoot三種方法實(shí)現(xiàn)定時(shí)發(fā)送郵件的案例,Spring框架的定時(shí)任務(wù)調(diào)度功能支持配置和注解兩種方式Spring?Boot在Spring框架的基礎(chǔ)上實(shí)現(xiàn)了繼承,并對(duì)其中基于注解方式的定時(shí)任務(wù)實(shí)現(xiàn)了非常好的支持,本文給大家詳細(xì)講解,需要的朋友可以參考下2023-03-03
SpringMVC框架實(shí)現(xiàn)Handler處理器的三種寫法
這篇文章主要介紹了SpringMVC框架實(shí)現(xiàn)Handler處理器的三種寫法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02

