詳解Java集合類之Map篇
1.Map接口介紹
Map用于保存具有映射關系的數(shù)據(jù):Key - Value
對于Set,底層其實依然是一個Map,但是Set選擇不使用Value,也就是Set的Value值始終是一個常量
Map中的Key和Value可以是任何類型的數(shù)據(jù),會封裝到HashMap$Node對象中
Map中的Key不能重復,但是Value可以重復,當有相同的Key時,等價與替換操作
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); }
那么這個Node節(jié)點的數(shù)據(jù)類型是什么樣的呢?
我們來看一下源代碼:(其還實現(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; // 存放下一個個節(jié)點,以形成鏈表結構 }
k-v為了方便程序員的遍歷,還會創(chuàng)建一個EntrySet集合,該集合存放的元素類型是Entry,而一個Entry對象含有k,v,但是本質上這里的k-v值還是指向一個Node節(jié)點中的數(shù)據(jù),也就是這里的k-v存放的依然是地址數(shù)據(jù)
// k-v存在有EntrySet的一個指向 Set set = map.entrySet(); System.out.println(set.getClass());
輸出:
class java.util.HashMap$EntrySet
那么,這個方便程序員遍歷的特性是如何體現(xiàn)的呢?
原因是Map.Entry提供了兩個非常重要的方法:K getKey(); V getValue();。所以我們可以通過如下的方式進行遍歷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這個鍵的地址是@727
再來看一下set中no2鍵的地址,一模一樣:
3.Map接口方法
代碼示例:
Map map = new HashMap(); // 添加鍵值對 map.put("no1","dahe"); map.put("no2","zhangsan"); // Key重復會進行替換 map.put("no1","lisi"); System.out.println(map); // 根據(jù)鍵刪除映射關系 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取出對應的value
// 取出所有的key,通過key取出對應的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 轉成 Map.Entry Map.Entry m = (Map.Entry) o; System.out.println(m.getKey()); System.out.println(m.getValue()); }
到此這篇關于詳解Java集合類之Map篇的文章就介紹到這了,更多相關Java集合類Map內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java兩種動態(tài)代理JDK動態(tài)代理和CGLIB動態(tài)代理詳解
這篇文章主要介紹了Java兩種動態(tài)代理JDK動態(tài)代理和CGLIB動態(tài)代理詳解,代理模式是23種設計模式的一種,他是指一個對象A通過持有另一個對象B,可以具有B同樣的行為的模式,為了對外開放協(xié)議,B往往實現(xiàn)了一個接口,A也會去實現(xiàn)接口,需要的朋友可以參考下2023-11-11SpringBoot2.0+阿里巴巴Sentinel動態(tài)限流實戰(zhàn)(附源碼)
這篇文章主要介紹了SpringBoot2.0+阿里巴巴Sentinel動態(tài)限流實戰(zhàn)(附源碼),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11SpringBoot使用JTA實現(xiàn)對多數(shù)據(jù)源的事務管理
了解事務的都知道,在我們日常開發(fā)中單單靠事務管理就可以解決絕大多數(shù)問題了,但是為啥還要提出JTA這個玩意呢,到底JTA是什么呢?他又是具體來解決啥問題的呢?本文小編就給大家介紹一下如何在Spring Boot中使用JTA實現(xiàn)對多數(shù)據(jù)源的事務管理2023-11-11