一文詳解Java中Map和Set接口的使用方法
Map與Set的基本概念與場景
Map和set是一種專門用來進(jìn)行搜索的容器或者數(shù)據(jù)結(jié)構(gòu),其搜索的效率與其具體的實(shí)例化子類有關(guān)。以前常見的搜索方式有:
1. 直接遍歷,時(shí)間復(fù)雜度為O(N),元素如果比較多效率會非常慢。
2. 二分查找,時(shí)間復(fù)雜度為O(log2^n),但搜索前必須要求序列是有序的。
上述排序比較適合靜態(tài)類型的查找,即一般不會對區(qū)間進(jìn)行插入和刪除操作了,而現(xiàn)實(shí)中的查找比如:
1. 根據(jù)姓名查詢考試成績
2. 通訊錄,即根據(jù)姓名查詢聯(lián)系方式
3. 不重復(fù)集合,即需要先搜索關(guān)鍵字是否已經(jīng)在集合中
可能在查找時(shí)進(jìn)行一些插入和刪除的操作,即動態(tài)查找,那上述兩種方式就不太適合了,本節(jié)介紹的Map和Set是一種適合動態(tài)查找的集合容器。
模型概念
一般把搜索的數(shù)據(jù)稱為關(guān)鍵字(Key),和關(guān)鍵字對應(yīng)的稱為值(Value),將其稱之為Key-value的鍵值對,所以模型會有兩種:
- 純 key 模型,例如:
- 有一個(gè)英文詞典,快速查找一個(gè)單詞是否在詞典中
- 快速查找某個(gè)名字在不在通訊錄中
- Key-Value 模型,例如:
- 統(tǒng)計(jì)文件中每個(gè)單詞出現(xiàn)的次數(shù),統(tǒng)計(jì)結(jié)果是每個(gè)單詞都有與其對應(yīng)的次數(shù):<單詞,單詞出現(xiàn)的次數(shù)
Map接口的性質(zhì)
在Java中,Map
接口是一個(gè)用于存儲鍵值對(key-value pairs)的對象,它屬于Java Collections Framework的一部分。Map
接口的主要特點(diǎn)包括:
鍵值對存儲:
Map
存儲的數(shù)據(jù)是以鍵值對的形式組織的,每個(gè)鍵(key)唯一對應(yīng)一個(gè)值(value)??梢酝ㄟ^鍵來快速獲取對應(yīng)的值。無序性:大多數(shù)實(shí)現(xiàn)類(如
HashMap
)不會保證元素的順序,除非使用特定的實(shí)現(xiàn)(如LinkedHashMap
,它可以保持插入順序,或者TreeMap
,它會按照鍵的自然順序或指定的比較器進(jìn)行排序)。鍵的唯一性:在同一個(gè)
Map
中,不能有重復(fù)的鍵。如果試圖將一個(gè)新的值與已有的鍵關(guān)聯(lián),原有的值將被新值替換。實(shí)現(xiàn)類:Java提供了多種
Map
接口的實(shí)現(xiàn),例如:HashMap
:基于哈希表的實(shí)現(xiàn),允許null值和null鍵,查找速度快。TreeMap
:基于紅黑樹的實(shí)現(xiàn),支持排序的鍵,查找速度相對較慢。LinkedHashMap
:結(jié)合了HashMap
的哈希表和鏈表特性,維護(hù)插入順序。
常用方法:
Map
接口提供了一系列的方法,例如:put(K key, V value)
:將指定的值與指定的鍵關(guān)聯(lián)。get(Object key)
:返回指定鍵所映射的值。remove(Object key)
:移除指定鍵的鍵值對。containsKey(Object key)
:檢查是否存在指定的鍵。keySet()
:返回Map中所有鍵的集合。values()
:返回Map中所有值的集合。
總之,Map
接口是Java中重要的數(shù)據(jù)結(jié)構(gòu)之一,方便有效地進(jìn)行數(shù)據(jù)的存儲和檢索,廣泛應(yīng)用于各種場景中。
Map接口的使用方法
put(K key, V value)
:將指定的值與指定的鍵關(guān)聯(lián)。
public class Main { public static void main(String[] args) { Map<String,Integer> map = new TreeMap<>(); map.put("one",1); map.put("two",2); map.put("three",3); map.put("four",4); } }
get(Object key)
:返回指定鍵所映射的值。
public class Main { public static void main(String[] args) { Map<String,Integer> map = new TreeMap<>(); map.put("one",1); map.put("two",2); map.put("three",3); map.put("four",4); System.out.println(map.get("two")); } }
V getOrDefault(Object key, V defaultValue) :返回 key 對應(yīng)的 value,key 不存在,返回默認(rèn)值
public class Main { public static void main(String[] args) { Map<String,Integer> map = new TreeMap<>(); map.put("one",1); map.put("two",2); map.put("three",3); map.put("four",4); System.out.println(map.getOrDefault("five",-1)); } }
Set<K> keySet() :返回所有 key 的不重復(fù)集合,用 Set 容器接收
public class Main { public static void main(String[] args) { Map<String,Integer> map = new TreeMap<>(); map.put("one",1); map.put("two",2); map.put("three",3); map.put("four",4); Set<String> strings = map.keySet(); } }
Collection<V> values() :返回所有 value 的可重復(fù)集合 ,用 Collection 容器接
public class Main { public static void main(String[] args) { Map<String,Integer> map = new TreeMap<>(); map.put("one",1); map.put("two",2); map.put("three",3); map.put("four",4); Collection<Integer> values = map.values(); System.out.println("=="); } }
Set<Map.Entry<K, V>> entrySet() :返回所有的 key-value 映射關(guān)系
public class Main { public static void main(String[] args) { Map<String,Integer> map = new TreeMap<>(); map.put("one",1); map.put("two",2); map.put("three",3); map.put("four",4); Set<Map.Entry<String, Integer>> entries = map.entrySet(); for (Map.Entry<String, Integer> entry : entries) { System.out.println("Key = "+entry.getKey()+" Val = "+entry.getValue()); } } }
注意:
- Map是一個(gè)接口,不能直接實(shí)例化對象,如果要實(shí)例化對象只能實(shí)例化其實(shí)現(xiàn)類TreeMap或者HashMap
- Map中存放鍵值對的Key是唯一的,value是可以重復(fù)的
- 在TreeMap中插入鍵值對時(shí),key不能為空,否則就會拋NullPointerException異常,value可以為空。但是HashMap的key和value都可以為空。
- Map中的Key可以全部分離出來,存儲到Set中來進(jìn)行訪問(因?yàn)镵ey不能重復(fù))。
- Map中的value可以全部分離出來,存儲在Collection的任何一個(gè)子集合中(value可能有重復(fù))。
- Map中鍵值對的Key不能直接修改,value可以修改,如果要修改key,只能先將該key刪除掉,然后再來進(jìn)行重新插入。
Set接口的性質(zhì)
在Java中,Set
接口是一個(gè)用于存儲唯一元素的集合,它也是Java Collections Framework的一部分。Set
接口的主要特點(diǎn)包括:
唯一性:
Set
中不允許重復(fù)的元素,這意味著集合中的每個(gè)元素都是唯一的。如果試圖添加重復(fù)元素,操作將被拒絕,集合的狀態(tài)不會改變。無序性:
Set
通常不保證元素的順序。尤其是使用HashSet
時(shí),元素的存儲順序是隨機(jī)的。而LinkedHashSet
可以維護(hù)元素的插入順序,TreeSet
則會按自然順序或自定義的比較器進(jìn)行排序。實(shí)現(xiàn)類:Java提供了多種
Set
接口的實(shí)現(xiàn),包括:HashSet
:基于哈希表的實(shí)現(xiàn),允許null元素,查找速度快,但不保證元素的順序。LinkedHashSet
:結(jié)合了哈希表和鏈表的特性,保持元素的插入順序。TreeSet
:基于紅黑樹的實(shí)現(xiàn),按升序排序元素,不允許null值。
常用方法:
Set
接口提供了一系列的方法,例如:add(E e)
:向集合中添加元素,如果元素已存在,則返回false。remove(Object o)
:移除指定元素。contains(Object o)
:檢查集合中是否包含指定元素。size()
:返回集合中元素的數(shù)量。clear()
:移除集合中的所有元素。iterator()
:返回一個(gè)迭代器,用于遍歷集合中的元素。
應(yīng)用場景:
Set
常用于需要存儲不重復(fù)元素的場景,比如去重、集合運(yùn)算(如交集、并集和差集)等。
總之,Set
接口是Java中重要的數(shù)據(jù)結(jié)構(gòu),適合用于處理唯一性要求的數(shù)據(jù)集合,具有高效的存儲和檢索特性。
Set接口的使用方法
set 接口中的方法和 Map 接口中的常見方法大差不差,就不一 一介紹了。
import java.util.TreeSet; import java.util.Iterator; import java.util.Set; public static void TestSet(){ Set<String> s = new TreeSet<>(); // add(key): 如果key不存在,則插入,返回ture // 如果key存在,返回false boolean isIn = s.add("apple"); s.add("orange"); s.add("peach"); s.add("banana"); System.out.println(s.size()); System.out.println(s); isIn = s.add("apple"); // add(key): key如果是空,拋出空指針異常 //s.add(null); // contains(key): 如果key存在,返回true,否則返回false System.out.println(s.contains("apple")); System.out.println(s.contains("watermelen")); // remove(key): key存在,刪除成功返回true // key不存在,刪除失敗返回false // key為空,拋出空指針異常 s.remove("apple"); System.out.println(s); s.remove("watermelen"); System.out.println(s); Iterator<String> it = s.iterator(); while(it.hasNext()){ System.out.print(it.next() + " "); } System.out.println(); }
以上就是一文詳解Java中Map和Set接口的使用方法的詳細(xì)內(nèi)容,更多關(guān)于Java Map和Set使用方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java static塊和構(gòu)造函數(shù)的實(shí)例詳解
這篇文章主要介紹了java static塊和構(gòu)造函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握J(rèn)ava static關(guān)鍵字的函數(shù)方法,需要的朋友可以參考下2017-09-09springboot如何開啟緩存@EnableCaching(使用redis)
在Spring Boot項(xiàng)目中集成Redis主要包括添加依賴到pom.xml、配置application.yml中的Redis連接參數(shù)、編寫配置類、在啟動類上添加@EnableCaching注解以及測試接口的查詢和緩存驗(yàn)證等步驟,首先,需要在pom.xml中添加spring-boot-starter-data-redis依賴2024-11-11netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析
這篇文章主要介紹了netty服務(wù)端輔助類ServerBootstrap創(chuàng)建邏輯分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識字的示例代碼
圖片中的文字提取已經(jīng)越來越多地應(yīng)用于數(shù)據(jù)輸入和自動化處理過程,本文主要介紹了SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識字的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06