Java?Map雙列集合使代碼更高效
Map雙列集合
Map是一種雙列集合,一個元素包含兩個值,一個是Key,一個是Value。Map集合中的元素,key和value的數據類型可以相同,也可以不同。一個映射不能包含重復的鍵;每個鍵最多只能有一個值。
今天我們繼續(xù)探索Java集合的世界,這次我們要聊的主題是——雙列集合Map。
首先,讓我們來理解一下什么是雙列集合。在Java中,集合是一種用于存儲對象的容器,而雙列集合則是一種可以同時通過兩個鍵(Key)來訪問元素的集合。聽起來有些復雜?別擔心,接下來我會用最簡單的語言,帶你走進Map的世界。
概述
現實生活中,我們常會看到這樣的一種集合:IP地址與主機名,身份證號與個人,學號與學生等,這種一一對應的關系,就叫做映射。Java提供了專門的集合類用來存放這種對象關系的對象,即java.util.Map接口。
Map 接口下的集合與Collection 接口下的集合,他們的存儲形式有所不同,如下圖:
Collection 集合,元素是獨立的,存儲的元素是一個一個的存儲。Map中的集合,元素是成對出現。每個元素由鍵與值兩部分組成,通過鍵可以找到所對應的值。所以 我們前面所說 Collection是單列集合,而Map 成為雙列集合。
需要注意,Map中的鍵不能重復,值可以重復,并且每個鍵只能對應一個值。
Map 常用子類
Map 接口也有很多子類,這里我們主要講解常用的HashMap集合,LinkedHashMap集合。
HashMap<K,V>: 存儲數據采用哈希表結構,元素的存取順序不能保證一致。
由于要保證鍵的唯一,不重復,需要重寫鍵的hashCode()方法,equals()方法。我們之前所學的HashSet 底層,實際上也是new了一個HashMap,但是只是使用了 HashMap中的 K,所以HashSet是不允許重復值的。
LinkedHashMap<K,V>:HashMap下有個子類LinkedHashMap,存儲數據采用的哈希表結構+鏈表結構。
通過鏈表結構可以保證元素的存取順序一致;通過哈希表結構可以保證的鍵的唯一、不重復,需要重寫鍵的hashCode()方法、equals()方法。
Set與Map之間的關系非常密切,從java 源碼來看,java是先實現了Map,然后通過包裝一個所有value都為null的Map,就實現了Set集合。
Map 接口中的常用方法
Map接口中定義了很多方法,常用的如下:
添加、刪除、修改操作
- Object put(Object key,Object value):將指定key-value添加到(或修改)當前map對象中
- void putAll(Map m):將m中的所有key-value對存放到當前map中
- Object remove(Object key):移除指定key的key-value對,并返回value
void clear():清空當前map中的所有數據 public class Demo1Map {
public static void main(String[ ] args) { // ○ Object put(Object key,Object value):將指定key-value添加到(或修 改)當前map對象中 // ○ void putAll(Map m):將m中的所有key-value對存放到當前map中 // ○ Object remove(Object key):移除指定key的key-value對,并返回value // ○ void clear():清空當前map中的所有數據 //創(chuàng)建集合對象 Map<String, Student> studentMap = new HashMap<>(); //將對應的對象放到map中 studentMap.put("N001", new Student("叮當", 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 如果鍵重復,會把原map中的節(jié)點替換 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對應的value
- boolean containsKey(Object key):是否包含指定的key
- boolean containsValue(Object value):是否包含指定的value
- int size():返回map中key-value對的個數
- boolean isEmpty():判斷當前map是否為空
boolean equals(Object obj):判斷當前map和參數對象obj是否相等
public class Demo2Map { public static void main(String[ ] args) { //創(chuàng)建集合對象 Map<String, Student> studentMap = new HashMap<>(); //將對應的對象放到map中 studentMap.put("N001", new Student("叮當", 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結果 == " + isContainsKey); //containsValue boolean containsValue = studentMap.containsValue(new Student("熙熙", 7)); System.out.println("containsValue結果 == " + 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 ,所以遍歷不能直接使用 迭代器和增強for循環(huán)。
那它如何遍歷呢? 我們知道,Map中存放的是兩種對象 Key對象 & Value對象,他們在Map中是一一對應的,這一對對象合起來在Map集中稱為 Entry 對象,也稱之為鍵值對象。
而我們在遍歷Map集合時,就可以從每一個鍵值對對象中獲取對應的鍵,然后找到對應的值。
鍵找值方式
在Map 集合中,為我們提供了一個方法
- keySet() 獲取Map中所有的鍵,由于鍵是唯一的,所以返回一個Set集合存儲所有的鍵`。
那我們就可以遍歷這個Set集合,通過 Entry的方法 - public V getValue():獲取Entry對象中的Value值。
鍵值對方式
在Map集合中也提供了獲取所有Entry對象的方法:
public Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中所有的鍵值對對象的集合(Set集合)。
那我們就 可以通過這個方法,獲取Map集合中,所有的鍵值對(Entry)對象的 Set集合,然后遍歷包含Entry對象的Set集合,得到每一個Entry對象。通過鍵值對(Entry)對象,獲取Entry對象中的鍵與值。
方法提示:getkey() getValue()
public class Demo3Map { public static void main(String[ ] args) { //方法一:keySet遍歷key+value: //創(chuàng)建集合對象 Map<String, Student> studentMap = new HashMap<>(); //將對應的對象放到map中 studentMap.put("N001", new Student("叮當", 7)); studentMap.put("N002", new Student("糖糖", 7)); studentMap.put("N003", new Student("熙熙", 7)); //獲取 map集合中的所有key Set<String> strings = studentMap.keySet(); //遍歷 key的集合,通過get()獲取沒一個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在實際應用中非常廣泛,例如在數據庫中存儲和查詢數據、在緩存中存儲和獲取數據、在處理用戶輸入和輸出時進行轉換等。通過使用Map,我們可以更高效地處理復雜的數據結構和業(yè)務邏輯。
總結
來說,Map是Java集合框架中的一個重要組成部分,它的強大功能和靈活應用為我們的編程工作帶來了極大的便利。希望通過今天的學習,你能對Map有一個更深入的理解,并能在實際編程中靈活運用,更多關于Java Map雙列集合的資料請關注腳本之家其它相關文章!
相關文章
在SpringBoot+MyBatis中優(yōu)雅處理多表數據清洗的實現步驟
數據清洗是指對數據進行處理和糾錯,以去除或修復數據集中存在的錯誤、不致、不完整和冗余的數據,從而使數據更加準確、可靠和有用,本文給大家介紹了在SpringBoot和MyBatis中優(yōu)雅處理多表數據清洗的實現步驟,需要的朋友可以參考下2025-03-03springboot jdbctemplate如何實現多數據源
這篇文章主要介紹了springboot jdbctemplate如何實現多數據源問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot實現定時發(fā)送郵件的三種方法案例詳解
這篇文章主要介紹了SpringBoot三種方法實現定時發(fā)送郵件的案例,Spring框架的定時任務調度功能支持配置和注解兩種方式Spring?Boot在Spring框架的基礎上實現了繼承,并對其中基于注解方式的定時任務實現了非常好的支持,本文給大家詳細講解,需要的朋友可以參考下2023-03-03