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

發佈了165 篇原創文章 · 獲贊 852 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章