Java 映射(Map)和集合(Set) 用法总结
1、定義層面
Map 接口定義映射,存儲(chǔ)一組鍵值對(duì)的映射關(guān)系。
Set 接口定義集合,存儲(chǔ)一組互不相同的元素,該接口繼承了 Collection 接口。
2、Map 接口的概念和常用方法
? ? ? Map 接口存儲(chǔ)一組鍵值對(duì)的映射關(guān)系,映射中的每個(gè)鍵對(duì)應(yīng)一個(gè)值。映射中不能有重復(fù)的鍵,否則會(huì)出現(xiàn)一個(gè)鍵對(duì)應(yīng)多個(gè)值的情況,這違背了映射的定義。
(1)放置鍵值對(duì)
? ? ??放置鍵值對(duì)的方法有 put 和 putAll,其中 put 一次放置一個(gè)鍵值對(duì),putAll 一次將另一個(gè)映射中的鍵值對(duì)全部添加道當(dāng)前映射中。在映射中放置鍵值對(duì)時(shí),如果映射中沒(méi)有對(duì)應(yīng)的鍵,則在映射中新建一個(gè)鍵值對(duì),否則用新的鍵值對(duì)覆蓋原來(lái)的相同鍵的鍵值對(duì)。
(2)刪除鍵值對(duì)
? ? ? 刪除鍵值對(duì)的方法有 remove 和 clear,其中 remove 刪除指定鍵的鍵值對(duì),clear 刪除當(dāng)前映射中的全部鍵值對(duì)。
(3)判斷包含鍵或值
? ? ? 判斷包含鍵或值的方法有 containsKey 和 containsValue,其中 containsKey 判斷映射中是否包含指定的鍵,containsValue判斷映射中是否包含指定的值。
(4)根據(jù)鍵獲得值
? ? ? 根據(jù)鍵獲得值得方法有 get,該方法返回映射中指定鍵的值。
(5)獲得鍵或鍵值對(duì)的集合
? ? ? 獲得鍵或鍵值對(duì)的集合的方法有 entrySet 和 keySet,其中 entrySet 返回映射的所有鍵值對(duì)的集合,keySet 返回映射的所有鍵的集合。
(6)獲得值的容器
獲得值的容器的方法有 values,該方法返回映射的所有值的容器。
(7)其他方法
方法 isEmpty 判斷當(dāng)前映射是否為空(即不包含鍵值對(duì)),方法 size 返回映射中的鍵值對(duì)數(shù)目。
(8)Map 接口的實(shí)現(xiàn)類 HashMap、Hashtable 和 TreeMap
- HashMap 和 Hashtable
? ? ? ? HashMap 類是散列映射,通過(guò)散列函數(shù)計(jì)算鍵對(duì)應(yīng)的存儲(chǔ)位置,因此可以快速地完成放置鍵值對(duì)、刪除鍵值對(duì)、根據(jù)鍵獲得值的操作。
//初始化方法 Map<Character,Integer>change=new HashMap<Character,Integer>(){{put('I',1);put('V',5);put('X',10);put('L',50);put('C',100);put('D',500);put('M',1000);}};? ? ? JDK 1.8 之前的 HashMap 的底層通過(guò)數(shù)組和鏈表實(shí)現(xiàn),如果出現(xiàn)沖突則通過(guò)拉鏈法解決沖突。JDK 1.8 在解決沖突時(shí)的實(shí)現(xiàn)有較大變化,當(dāng)鏈表長(zhǎng)度大于閾值(默認(rèn)為 8)時(shí),將鏈表轉(zhuǎn)化為紅黑樹(shù),以減少搜索時(shí)間。
? ? ? ?Hashtable 類是散列表,其功能和 HashMap 相似。以下是 HashMap 和 Hashtable 的部分區(qū)別。
? ? ? ?HashMap 不是線程安全的,Hashtable 的大多數(shù)方法用關(guān)鍵字 synchronized 修飾,因此 Hashtable 是線程安全的。在不需要保證線程安全的情況下,HashMap 的效率高于 Hashtable。
? ? ? ?HashMap 允許鍵或值為 null,只能有一個(gè)鍵為 null,可以有一個(gè)或多個(gè)鍵對(duì)應(yīng)的值為 null,Hashtable 不允許鍵或值為 null。
? ? ? ? 從 JDK 1.8 開(kāi)始,HashMap 在鏈表長(zhǎng)度大于閾值(默認(rèn)為 8)時(shí),將鏈表轉(zhuǎn)化為紅黑樹(shù)以減少搜索時(shí)間,Hashtable 沒(méi)有這樣的機(jī)制。
- TreeMap
? ? ? ?TreeMap 是有序映射,鍵可以使用 Comparable 接口或 Comparator 接口排序。
? ? ? ?TreeMap 的底層實(shí)現(xiàn)是紅黑樹(shù),通過(guò)紅黑樹(shù)維護(hù)映射的有序性。由于要維護(hù)映射的有序性,因此 TreeMap 的各項(xiàng)操作的平均效率低于 HashMap,但是 TreeMap 可以按照順序獲得鍵值對(duì)。
3、Set 接口的定義和常用方法
? ? ? ?Set 接口存儲(chǔ)一組互不相同的元素,一個(gè)集合中不存在兩個(gè)相等的元素。
? ? ? ?Set 接口繼承了 Collection 接口,沒(méi)有引入新的方法或常量,只是規(guī)定其實(shí)例不能包含相等的元素。
(1)Set 接口的實(shí)現(xiàn)類 HashSet 和 TreeSet
- HashSet
? ? ? ?HashSet 類是散列集合,其底層實(shí)現(xiàn)基于 HashMap。當(dāng)對(duì)象加入散列集合時(shí),需要判斷元素是否重復(fù),首先通過(guò)方法 hashCode 計(jì)算對(duì)象的散列碼檢查是否有對(duì)象具有相同的散列碼,如果沒(méi)有相同的散列碼則沒(méi)有重復(fù)元素,否則再通過(guò)方法 equals 檢查是否有相等的對(duì)象。
? ? ? ?根據(jù)散列約定,如果兩個(gè)對(duì)象相同,它們的散列碼一定相同,因此如果在子類中重寫了 equals 方法,必須在該子類中重寫 hashCode 方法,以保證兩個(gè)相等的對(duì)象對(duì)應(yīng)的散列碼是相同的。
- TreeSet
TreeSet 類是有序集合,其底層實(shí)現(xiàn)基于 TreeMap。和 TreeMap 相似,TreeSet 可以使用 Comparable 接口或 Comparator 接口對(duì)元素排序。
總結(jié)
以上是生活随笔為你收集整理的Java 映射(Map)和集合(Set) 用法总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 002 如何将电子版一寸照以照片的方式打
- 下一篇: Java 反射和映射