1. 程式人生 > 程式設計 >JS物件陣列去重的3種方法示例及對比

JS物件陣列去重的3種方法示例及對比

Java集合容器

一、Collection介面


Java中常用的List,Set集合都繼承字Collection介面並且都可以迭代

  • list和set的區別
    1. list集合是有序的,set集合是無序的
    2. list集合允許重複元素,set集合不允許重複(HashSet底層採用HashMap去重
  • List實現類
    1. ArrayList底層採用陣列實現,執行緒不安全。
    2. Vector底層採用陣列實現,執行緒安全。
    3. Linked底層採用雙向連結串列實現,並且實現了Queue介面,可以使用佇列的特性,執行緒不安全
  • Set實現類
    1. HashSet(無序,唯一): 基於 HashMap 實現的,底層採用 HashMap 來儲存元素
    2. LinkedHashSet:LinkedHashSet 是 HashSet 的子類,並且其內部是通過 LinkedHashMap 來實現的。有點類似於我們之前說的 LinkedHashMap 其內部是基於 HashMap 實現一樣,不過還是有一點點區別的
    3. TreeSet(有序,唯一): 紅黑樹(自平衡的排序二叉樹)
  • ArrayList 和 Vector的區別
    1. ·ArrayList 是 List 的主要實現類,底層使用 Object[ ]儲存,適用於頻繁的查詢工作,執行緒不安全
    2. Vector是 List 的古老實現類,底層使用Object[ ] 儲存,執行緒安全的。
  • ArrayList 和 LinkedList 的區別
    1. 是否保證執行緒安全:
      ArrayList LinkedList都是不同步的,也就是不保證執行緒安全;
    2. 底層資料結構: Arraylist底層使用的是 Object 陣列;LinkedList底層使用的是 雙向連結串列 資料結構(JDK1.6 之前為迴圈連結串列,JDK1.7 取消了迴圈。)
    3. 是否支援快速隨機訪問: LinkedList不支援高效的隨機元素訪問,而 ArrayList 支援。快速隨機訪問就是通過元素的序號快速獲取元素物件(對應於get(int index)方法)。
    4. 記憶體空間佔用: ArrayList 的空間浪費主要體現在在 list 列表的結尾會預留一定的容量空間,而 LinkedList的空間花費則體現在它的每一個元素都需要消耗比 ArrayList
      更多的空間(因為要存放直接後繼和直接前驅以及資料)。

二、Map介面

  • HashMapHashTable的區別
    執行緒是否安全: 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 沒有這樣的機制。