JS物件陣列去重的3種方法示例及對比
阿新 • • 發佈:2021-07-19
Java集合容器
一、Collection介面
Java中常用的List,Set集合都繼承字Collection介面並且都可以迭代
- list和set的區別
- list集合是有序的,set集合是無序的
- list集合允許重複元素,set集合不允許重複(HashSet底層採用HashMap去重)
- List實現類
ArrayList
底層採用陣列實現,執行緒不安全。Vector
底層採用陣列實現,執行緒安全。Linked
底層採用雙向連結串列實現,並且實現了Queue介面,可以使用佇列的特性,執行緒不安全
- Set實現類
HashSet
(無序,唯一): 基於 HashMap 實現的,底層採用 HashMap 來儲存元素LinkedHashSet
:LinkedHashSet 是 HashSet 的子類,並且其內部是通過 LinkedHashMap 來實現的。有點類似於我們之前說的 LinkedHashMap 其內部是基於 HashMap 實現一樣,不過還是有一點點區別的TreeSet
(有序,唯一): 紅黑樹(自平衡的排序二叉樹)
- ArrayList 和 Vector的區別
- ·
ArrayList
是 List 的主要實現類,底層使用 Object[ ]儲存,適用於頻繁的查詢工作,執行緒不安全 Vector
是 List 的古老實現類,底層使用Object[ ] 儲存,執行緒安全的。
- ·
- ArrayList 和 LinkedList 的區別
- 是否保證執行緒安全:
ArrayList
和LinkedList
都是不同步的,也就是不保證執行緒安全; - 底層資料結構:
Arraylist
底層使用的是 Object 陣列;LinkedList
底層使用的是 雙向連結串列 資料結構(JDK1.6 之前為迴圈連結串列,JDK1.7 取消了迴圈。) - 是否支援快速隨機訪問:
LinkedList
不支援高效的隨機元素訪問,而ArrayLis
t 支援。快速隨機訪問就是通過元素的序號快速獲取元素物件(對應於get(int index)方法)。 - 記憶體空間佔用:
ArrayList
的空間浪費主要體現在在 list 列表的結尾會預留一定的容量空間,而LinkedList
的空間花費則體現在它的每一個元素都需要消耗比ArrayList
- 是否保證執行緒安全:
二、Map介面
HashMap
和HashTable
的區別
執行緒是否安全: HashMap 是非執行緒安全的,HashTable 是執行緒安全的,因為 HashTable 內部的方法基本都經過synchronized 修飾。(如果你要保證執行緒安全的話就使用 ConcurrentHashMap 吧!);
效率: 因為執行緒安全的問題,HashMap 要比 HashTable 效率高一點。另外,HashTable 基本被淘汰,不要在程式碼中使用它;
對 Null key 和 Null value 的支援: HashMap 可以儲存 null 的 key 和 value,但 null 作為鍵只能有一個,null 作為值可以有多個;HashTable 不允許有 null 鍵和 null 值,否則會丟擲 NullPointerException。
初始容量大小和每次擴充容量大小的不同 : ① 建立時如果不指定容量初始值,Hashtable 預設的初始大小為 11,之後每次擴充,容量變為原來的 2n+1。HashMap 預設的初始化大小為 16。之後每次擴充,容量變為原來的 2 倍。② 建立時如果給定了容量初始值,那麼 Hashtable 會直接使用你給定的大小,而 HashMap 會將其擴充為 2 的冪次方大小(HashMap 中的tableSizeFor()方法保證)。也就是說 HashMap 總是使用 2 的冪作為雜湊表的大小,後面會介紹到為什麼是 2 的冪次方。
底層資料結構: JDK1.8 以後的 HashMap 在解決雜湊衝突時有了較大的變化,當連結串列長度大於閾值(預設為 8)(將連結串列轉換成紅黑樹前會判斷,如果當前陣列的長度小於 64,那麼會選擇先進行陣列擴容,而不是轉換為紅黑樹)時,將連結串列轉化為紅黑樹,以減少搜尋時間。Hashtable 沒有這樣的機制。