HashSet/HashMap、TreeSet/TreeMap、LinkedHashSet/LinkedHashMap 區別
Map 集合中儲存 Key-value 對形式的元素,訪問時只能根據每項元素的 key 來訪問其 value
Set 集合是無序集合,集合中的元素不可以重複,訪問集合中的元素只能根據元素本身來訪問(也是集合裡元素不允許重複的原因)
一、Map介面
Map 是一個對映介面,即 key-value 鍵值對。Map 中的每一個元素包含 “一個 key” 和 “key 對應的 value”。AbstractMap 是個抽象類,它實現了 Map 介面中的大部分 API。而 HashMap,TreeMap,都是繼承於 AbstractMap。
二、Map實現類
HashMap 可實現快速儲存和檢索,但其缺點是其包含的元素是無序的,這導致它在存在大量迭代的情況下表現不佳。
LinkedHashMap 保留了 HashMap 的優勢,且其包含的元素是有序的。它在有大量迭代的情況下表現更好。
TreeMap 能便捷的實現對其內部元素的各種排序,但其一般效能比前兩種 map 差。
LinkedHashMap 對映減少了 HashMap 排序中的混亂,且不會導致 TreeMap 的效能損失。
HashMap、LinkedHashMap、TreeMap三者均執行緒不安全
三、Set 介面
1.Set 不允許包含相同的元素,如果試圖把兩個相同元素加入同一個集合中,add 方法返回 false(注意,是add的返回值為false,並未報錯,只是該重複的元素並未加入其中)。
2.Set 判斷兩個物件相同不是使用 == 運算子,而是根據 equals 方法。也就是說,只要兩個物件用 equals 方法比較返回 true,Set 就不會接受這兩個物件。
四、Set的實現類
Set 的實現類有 HastSet 和 TreeSet。 HashSet 依賴於 HashMap,它實際上是通過 HashMap 實現的;TreeSet 依賴於 TreeMap,它實際上是通過 TreeMap 實現的。LinkedHashSet是HashSet的實現類。
1.HashSet:元素無序。
比如存入 a、e、c、d、b,輸出 d、e、b、c、a。
2.LinkedHashSet:怎麼存進去,怎麼出來。
比如存入 a、e、c、d、b,輸出 a、e、c、d、b。
3.TreeSet:排好序的輸出。
比如存入 a、e、c、d、b,輸出 a、b、c、d、e。
總體而言,如果你需要一個訪問快速的 Set,你應該使用 HashSet;當你需要一個排序的 Set,你應該使用 TreeSet;當你需要記錄下插入時的順序時,你應該使用 LinedHashSet。同時,比起map所有的set都是帶有去重功能的,同時三者均是非執行緒安全。
綜合考慮
有去重需求的考慮set實現類,在根據具體情況(排序——TreeSet、按存入順序——LinkedHashSet,效能——HashSet)考慮具體實現類,如果沒有去重需求,則考慮map,map的效能整體比set要好,因為set的底層實現是map。
補充:
Set<Integer> set = new TreeSet<>(Comparator.reverseOrder());
Map<String,Integer> map = new TreeMap<>(Comparator.reverseOrder());
在Tree物件宣告的時候,可以呼叫comparator類的reverseOrder方法實現倒序儲存。
相關文章
- 轉:Java中的HashSet, TreeSet, HashMap, TreeMapJavaHashMap
- HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap區別HashMap
- Java中HashMap,LinkedHashMap,TreeMap的區別[轉]JavaHashMap
- Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及區別Java
- Java Set 常用集合 HashSet、LinkedHashSet、TreeSetJava
- java基礎:HashSet/LinkedHashSet/TreeSet — 原始碼分析Java原始碼
- HashMap、LinkedHashMap、HashTable、HashSet筆記HashMap筆記
- Java集合系列(四):HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及區別JavaHashMap
- HashSet與HashMap的區別HashMap
- HashTable HashMap HashSet區別(java)HashMapJava
- Java 容器和泛型(3)HashSet,TreeSet 和 LinkedHashSet比較Java泛型
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- 關於HashSet與TreeSet的區別與聯絡
- 深入淺出 Map 的實現(HashMap、HashTable、LinkedHashMap、TreeMap)HashMap
- HashMap,LinkedHashMap,TreeMap讀取大量資料效率的比較HashMap
- Java中HashMap和TreeMap的區別深入理解JavaHashMap
- HashTable、ConcurrentHashMap、TreeMap、HashMap關於鍵值的區別HashMap
- HashSet、TreeSet、CopyOnWriteArraySet和CopyOnWriteArrayList
- 好程式設計師Java培訓分享treeset和hashset的區別程式設計師Java
- Java集合詳解7:一文搞清楚HashSet,TreeSet與LinkedHashSet的異同Java
- Java類集框架 —— HashSet、LinkedHashSet原始碼分析Java框架原始碼
- HashMap、HashTable、HashSet詳解HashMap
- HashMap和HashSet深度解析HashMap
- Java集合框架原始碼剖析:TreeSet 和 TreeMapJava框架原始碼
- Java集合框架原始碼剖析:LinkedHashSet 和 LinkedHashMapJava框架原始碼HashMap
- Java 集合框架 LinkedHashSet 和 LinkedHashMap 原始碼剖析Java框架HashMap原始碼
- 你真的瞭解HashSet 和HashMap的區別、優缺點、使用場景嗎?HashMap
- TreeMap和HashMap的元素比較HashMap
- 【集合框架】JDK1.8原始碼分析HashSet && LinkedHashSet(八)框架JDK原始碼
- Java集合(3)一 紅黑樹、TreeMap與TreeSet(上)Java
- Java集合(4)一 紅黑樹、TreeMap與TreeSet(下)Java
- java基礎學習之十:集合型別Set/List/Map(TreeSet,LinkedList,TreeMap)Java型別
- 集合框架-HashMap&HashSet&LinkedHshMap框架HashMap
- Java集合(5)一 HashMap與HashSetJavaHashMap
- List集合(ArrayList-LinkedList);Set集合(HashSet-TreeSet)
- 搞懂 HashSet & LinkedHashSet 原始碼以及集合常見面試題目原始碼面試題
- Java HashMap 和 HashSet 的高效使用技巧JavaHashMap
- ConcurrentHashMap HashMap HashTable區別HashMap