詳解Java集合類之Map篇
1.Map接口介紹
Map用于保存具有映射關(guān)系的數(shù)據(jù):Key - Value
對于Set,底層其實(shí)依然是一個(gè)Map,但是Set選擇不使用Value,也就是Set的Value值始終是一個(gè)常量
Map中的Key和Value可以是任何類型的數(shù)據(jù),會封裝到HashMap$Node對象中
Map中的Key不能重復(fù),但是Value可以重復(fù),當(dāng)有相同的Key時(shí),等價(jià)與替換操作
2.Map接口分析
存放Map鍵值對是在HashMap$Node中
tab[i] = newNode(hash, key, value, null);
--
Node<K,V> newNode(int hash, K key, V value, Node<K,V> next) {
return new Node<>(hash, key, value, next);
}
那么這個(gè)Node節(jié)點(diǎn)的數(shù)據(jù)類型是什么樣的呢?
我們來看一下源代碼:(其還實(shí)現(xiàn)了Entry接口)
static class Node<K,V> implements Map.Entry<K,V> {
final int hash; // 存放hash值
final K key; // 存放key值
V value; // 存放Value值
Node<K,V> next; // 存放下一個(gè)個(gè)節(jié)點(diǎn),以形成鏈表結(jié)構(gòu)
}
k-v為了方便程序員的遍歷,還會創(chuàng)建一個(gè)EntrySet集合,該集合存放的元素類型是Entry,而一個(gè)Entry對象含有k,v,但是本質(zhì)上這里的k-v值還是指向一個(gè)Node節(jié)點(diǎn)中的數(shù)據(jù),也就是這里的k-v存放的依然是地址數(shù)據(jù)
// k-v存在有EntrySet的一個(gè)指向 Set set = map.entrySet(); System.out.println(set.getClass());
輸出:
class java.util.HashMap$EntrySet
那么,這個(gè)方便程序員遍歷的特性是如何體現(xiàn)的呢?
原因是Map.Entry提供了兩個(gè)非常重要的方法:K getKey(); V getValue();。所以我們可以通過如下的方式進(jìn)行遍歷Map:
Set set = map.entrySet();
System.out.println(set.getClass());
for (Object obj : set) {
Map.Entry entry = (Map.Entry) obj;
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
那怎么證明Entry里面存放的k-v只是地址的指向呢?很簡單
通過debug,我們先來看一下Map中存放的數(shù)據(jù),其no2這個(gè)鍵的地址是@727

再來看一下set中no2鍵的地址,一模一樣:

3.Map接口方法
代碼示例:
Map map = new HashMap();
// 添加鍵值對
map.put("no1","dahe");
map.put("no2","zhangsan");
// Key重復(fù)會進(jìn)行替換
map.put("no1","lisi");
System.out.println(map);
// 根據(jù)鍵刪除映射關(guān)系
map.remove("no1");
System.out.println(map);
// 根據(jù)key得到值
Object no2 = map.get("no2");
System.out.println(no2);
// 獲取鍵值對數(shù)量
System.out.println(map.size());
// 判空
System.out.println(map.isEmpty());
// 清空
// map.clear();
// 查找鍵是否存在
System.out.println(map.containsKey("ok"));
4.Map遍歷方式
第一式:取出所有的key,通過key取出對應(yīng)的value
// 取出所有的key,通過key取出對應(yīng)的value
Set keySet = map.keySet();
for (Object o : keySet) {
System.out.println(o);
System.out.println(map.get(o));
}
第二式:把所有的value值取出
// 把所有的value值取出
Collection values = map.values();
for (Object value : values) {
System.out.println(value);
}
第三式:通過EntrySet來獲取 k-v
// 通過EntrySet來獲取 k-v
Set entrySet1 = map.entrySet();
for (Object o : entrySet1) {
// 將entry 轉(zhuǎn)成 Map.Entry
Map.Entry m = (Map.Entry) o;
System.out.println(m.getKey());
System.out.println(m.getValue());
}到此這篇關(guān)于詳解Java集合類之Map篇的文章就介紹到這了,更多相關(guān)Java集合類Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot項(xiàng)目監(jiān)控開發(fā)小用例(實(shí)例分析)
這篇文章主要介紹了springboot項(xiàng)目監(jiān)控開發(fā)小用例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
SpringBoot?替換?if?的參數(shù)校驗(yàn)示例代碼
Spring?Validation是對hibernate?validation的二次封裝,用于支持spring?mvc參數(shù)自動(dòng)校驗(yàn),接下來,我們以spring-boot項(xiàng)目為例,介紹Spring?Validation的使用,需要的朋友可以參考下2022-12-12
SpringBoot接口調(diào)用之后報(bào)404問題的解決方案
這篇文章主要介紹了SpringBoot接口調(diào)用之后報(bào)404問題的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。2021-06-06
Java基礎(chǔ)之?dāng)?shù)組模擬循環(huán)隊(duì)列
這篇文章主要介紹了Java基礎(chǔ)之?dāng)?shù)組模擬循環(huán)隊(duì)列,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們也有非常好的幫助,需要的朋友可以參考下2021-04-04
基于Spring Boot不同的環(huán)境使用不同的配置方法
下面小編就為大家分享一篇基于Spring Boot不同的環(huán)境使用不同的配置方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

