集合資料結構總結

Echizen_1發表於2019-03-31

 List

 有序集合

ArrayList

結構:採用陣列結構,查詢效能優秀(陣列將元素在記憶體中連續存放,連結串列非順序存放),插入以及刪除效能較差(插入以及刪除都會設計到目標元素後的元素位置移動,而連結串列只需要修改指向下標)

擴容:

  1. 建立一個容量為原陣列容量1.5倍的新陣列,並將原陣列複製到新陣列
  2. 新新增元素插入到新陣列最後一位
  3. 原陣列被GC處理

ArrayList與陣列的區別?

  1. 陣列需要指定長度,ArrayList不用,預設10
  2. ArrayList可以動態擴容,1.5倍

LinkedList

結構:採用雙連結串列結構,插入刪除效能優秀

無需擴容

Vector

執行緒安全,擴容時增加一倍

Set

無序集合,用於排重

TreeSet

支援自然順序訪問,插入刪除效能低效

HashSet

利用雜湊演算法,插入刪除效能優秀,不保證有序

LinkedHashSet

內部維護一個記錄插入順序的雙向連結串列,所以既保證有序,又保證插入刪除的效能,但是效能低於HashSet,因為維護連結串列有額外開銷

Queue

佇列結構,先入先出、後入後出,有優先順序佇列,可用於優先順序處理場景

Map

HashMap

結構:採用陣列+連結串列的資料結構,在jdk 1.8中,當連結串列長度超過8改變結構為紅黑樹

特性:put時,根據hash函式(key的hash值 異或 (陣列長度-1))得到陣列下標,確定放入某一個桶中,當桶中有元素時,根據equals挨個判斷是否存在相同key值,存在的話則覆蓋,不存在則新增

高併發情況下,jdk 1.7 hashmap會出現環形連結串列死迴圈情況,1.8採用頭插法解決

支援null鍵值

擴容:與陣列一樣,擴容時建立新陣列,然後將元素重新進行hash排序

HashTable

本身同步,不支援null鍵值

TreeMap

基於紅黑樹提供順序訪問

LinkHashMap

與hashmap類似,內部額外提供雙向連結串列,提供順序訪問



相關文章