一文詳解Java中Map和Set接口的使用方法
Map與Set的基本概念與場(chǎng)景
Map和set是一種專(zhuān)門(mén)用來(lái)進(jìn)行搜索的容器或者數(shù)據(jù)結(jié)構(gòu),其搜索的效率與其具體的實(shí)例化子類(lèi)有關(guān)。以前常見(jiàn)的搜索方式有:
1. 直接遍歷,時(shí)間復(fù)雜度為O(N),元素如果比較多效率會(huì)非常慢。
2. 二分查找,時(shí)間復(fù)雜度為O(log2^n),但搜索前必須要求序列是有序的。
上述排序比較適合靜態(tài)類(lèi)型的查找,即一般不會(huì)對(duì)區(qū)間進(jìn)行插入和刪除操作了,而現(xiàn)實(shí)中的查找比如:
1. 根據(jù)姓名查詢考試成績(jī)
2. 通訊錄,即根據(jù)姓名查詢聯(lián)系方式
3. 不重復(fù)集合,即需要先搜索關(guān)鍵字是否已經(jīng)在集合中
可能在查找時(shí)進(jìn)行一些插入和刪除的操作,即動(dòng)態(tài)查找,那上述兩種方式就不太適合了,本節(jié)介紹的Map和Set是一種適合動(dòng)態(tài)查找的集合容器。
模型概念
一般把搜索的數(shù)據(jù)稱(chēng)為關(guān)鍵字(Key),和關(guān)鍵字對(duì)應(yīng)的稱(chēng)為值(Value),將其稱(chēng)之為Key-value的鍵值對(duì),所以模型會(huì)有兩種:
- 純 key 模型,例如:
- 有一個(gè)英文詞典,快速查找一個(gè)單詞是否在詞典中
- 快速查找某個(gè)名字在不在通訊錄中
- Key-Value 模型,例如:
- 統(tǒng)計(jì)文件中每個(gè)單詞出現(xiàn)的次數(shù),統(tǒng)計(jì)結(jié)果是每個(gè)單詞都有與其對(duì)應(yīng)的次數(shù):<單詞,單詞出現(xiàn)的次數(shù)

Map接口的性質(zhì)
在Java中,Map接口是一個(gè)用于存儲(chǔ)鍵值對(duì)(key-value pairs)的對(duì)象,它屬于Java Collections Framework的一部分。Map接口的主要特點(diǎn)包括:
鍵值對(duì)存儲(chǔ):
Map存儲(chǔ)的數(shù)據(jù)是以鍵值對(duì)的形式組織的,每個(gè)鍵(key)唯一對(duì)應(yīng)一個(gè)值(value)??梢酝ㄟ^(guò)鍵來(lái)快速獲取對(duì)應(yīng)的值。無(wú)序性:大多數(shù)實(shí)現(xiàn)類(lèi)(如
HashMap)不會(huì)保證元素的順序,除非使用特定的實(shí)現(xiàn)(如LinkedHashMap,它可以保持插入順序,或者TreeMap,它會(huì)按照鍵的自然順序或指定的比較器進(jìn)行排序)。鍵的唯一性:在同一個(gè)
Map中,不能有重復(fù)的鍵。如果試圖將一個(gè)新的值與已有的鍵關(guān)聯(lián),原有的值將被新值替換。實(shí)現(xiàn)類(lèi):Java提供了多種
Map接口的實(shí)現(xiàn),例如:HashMap:基于哈希表的實(shí)現(xiàn),允許null值和null鍵,查找速度快。TreeMap:基于紅黑樹(shù)的實(shí)現(xiàn),支持排序的鍵,查找速度相對(duì)較慢。LinkedHashMap:結(jié)合了HashMap的哈希表和鏈表特性,維護(hù)插入順序。
常用方法:
Map接口提供了一系列的方法,例如:put(K key, V value):將指定的值與指定的鍵關(guān)聯(lián)。get(Object key):返回指定鍵所映射的值。remove(Object key):移除指定鍵的鍵值對(duì)。containsKey(Object key):檢查是否存在指定的鍵。keySet():返回Map中所有鍵的集合。values():返回Map中所有值的集合。
總之,Map接口是Java中重要的數(shù)據(jù)結(jié)構(gòu)之一,方便有效地進(jìn)行數(shù)據(jù)的存儲(chǔ)和檢索,廣泛應(yīng)用于各種場(chǎ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 對(duì)應(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í)例化對(duì)象,如果要實(shí)例化對(duì)象只能實(shí)例化其實(shí)現(xiàn)類(lèi)TreeMap或者HashMap
- Map中存放鍵值對(duì)的Key是唯一的,value是可以重復(fù)的
- 在TreeMap中插入鍵值對(duì)時(shí),key不能為空,否則就會(huì)拋NullPointerException異常,value可以為空。但是HashMap的key和value都可以為空。
- Map中的Key可以全部分離出來(lái),存儲(chǔ)到Set中來(lái)進(jìn)行訪問(wèn)(因?yàn)镵ey不能重復(fù))。
- Map中的value可以全部分離出來(lái),存儲(chǔ)在Collection的任何一個(gè)子集合中(value可能有重復(fù))。
- Map中鍵值對(duì)的Key不能直接修改,value可以修改,如果要修改key,只能先將該key刪除掉,然后再來(lái)進(jìn)行重新插入。
Set接口的性質(zhì)
在Java中,Set接口是一個(gè)用于存儲(chǔ)唯一元素的集合,它也是Java Collections Framework的一部分。Set接口的主要特點(diǎn)包括:
唯一性:
Set中不允許重復(fù)的元素,這意味著集合中的每個(gè)元素都是唯一的。如果試圖添加重復(fù)元素,操作將被拒絕,集合的狀態(tài)不會(huì)改變。無(wú)序性:
Set通常不保證元素的順序。尤其是使用HashSet時(shí),元素的存儲(chǔ)順序是隨機(jī)的。而LinkedHashSet可以維護(hù)元素的插入順序,TreeSet則會(huì)按自然順序或自定義的比較器進(jìn)行排序。實(shí)現(xiàn)類(lèi):Java提供了多種
Set接口的實(shí)現(xiàn),包括:HashSet:基于哈希表的實(shí)現(xiàn),允許null元素,查找速度快,但不保證元素的順序。LinkedHashSet:結(jié)合了哈希表和鏈表的特性,保持元素的插入順序。TreeSet:基于紅黑樹(shù)的實(shí)現(xiàn),按升序排序元素,不允許null值。
常用方法:
Set接口提供了一系列的方法,例如:add(E e):向集合中添加元素,如果元素已存在,則返回false。remove(Object o):移除指定元素。contains(Object o):檢查集合中是否包含指定元素。size():返回集合中元素的數(shù)量。clear():移除集合中的所有元素。iterator():返回一個(gè)迭代器,用于遍歷集合中的元素。
應(yīng)用場(chǎng)景:
Set常用于需要存儲(chǔ)不重復(fù)元素的場(chǎng)景,比如去重、集合運(yùn)算(如交集、并集和差集)等。
總之,Set接口是Java中重要的數(shù)據(jù)結(jié)構(gòu),適合用于處理唯一性要求的數(shù)據(jù)集合,具有高效的存儲(chǔ)和檢索特性。
Set接口的使用方法
set 接口中的方法和 Map 接口中的常見(jiàn)方法大差不差,就不一 一介紹了。
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使用方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
RabbitMQ簡(jiǎn)單隊(duì)列實(shí)例及原理解析
這篇文章主要介紹了RabbitMQ簡(jiǎn)單隊(duì)列實(shí)例及原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
java static塊和構(gòu)造函數(shù)的實(shí)例詳解
這篇文章主要介紹了java static塊和構(gòu)造函數(shù)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握J(rèn)ava static關(guān)鍵字的函數(shù)方法,需要的朋友可以參考下2017-09-09
springboot如何開(kāi)啟緩存@EnableCaching(使用redis)
在Spring Boot項(xiàng)目中集成Redis主要包括添加依賴到pom.xml、配置application.yml中的Redis連接參數(shù)、編寫(xiě)配置類(lèi)、在啟動(dòng)類(lèi)上添加@EnableCaching注解以及測(cè)試接口的查詢和緩存驗(yàn)證等步驟,首先,需要在pom.xml中添加spring-boot-starter-data-redis依賴2024-11-11
netty服務(wù)端輔助類(lèi)ServerBootstrap創(chuàng)建邏輯分析
這篇文章主要介紹了netty服務(wù)端輔助類(lèi)ServerBootstrap創(chuàng)建邏輯分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識(shí)字的示例代碼
圖片中的文字提取已經(jīng)越來(lái)越多地應(yīng)用于數(shù)據(jù)輸入和自動(dòng)化處理過(guò)程,本文主要介紹了SpringBoot結(jié)合Tess4J實(shí)現(xiàn)拍圖識(shí)字的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06

