HashSet/HashMap、TreeSet/TreeMap、LinkedHashSet/LinkedHashMap 區別

、ZJL發表於2020-11-30

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方法實現倒序儲存。

相關文章