1. 程式人生 > >java原始碼集合類注意事項

java原始碼集合類注意事項

ArrayList:底層陣列

  1. ArrayList.add()--每次add的時候會判斷資料長度,如果不夠的話會呼叫Arrays.copyOf,複製一份更長的陣列,並把前面的資料放進去。
  2. ArrayList.remove()--直接使用System.arraycopy把需要刪除index後面的都往前移一位然後再把最後一個去掉。

LinkedList:底層連結串列

陣列和連結串列2種資料結構的對比:

  1. 查詢方面。陣列的效率更高,可以直接索引出查詢,而連結串列必須從頭查詢。
  2. 插入刪除方面。特別是在中間進行插入刪除,這時候連結串列體現出了極大的便利性,只需要在插入或者刪除的地方斷掉鏈然後插入或者移除元素,然後再將前後鏈重新組裝,但是陣列必須重新複製一份將所有資料後移或者前移。
  3. 在記憶體申請方面,當陣列達到初始的申請長度後,需要重新申請一個更大的陣列然後把資料遷移過去才行。而連結串列只需要動態建立即可。

HashSet:基於HashMap儲存,實際為HashMap的key集合,value預設為Object PRESENT。其操作方法實際為map的操作方法。

同理,LInkedHashSet基於LinkedHashMao實現。

TreeSet基於TreeMap,元素需要實現Comparable介面。

HashMap採用陣列和連結串列組合方式,hash值放陣列,如果不同的key算出的hash相同產生碰撞,則會產生連結串列解決衝突問題。

LinkedHashMap基於HashMap,但額外維護了一份雙向連結串列,有兩種順序:插入順序(預設,accessOrder false)和訪問順序(accessOrder true,LRU,最近使用的到末尾去,實現方法是先刪除,再在尾部插入)。儲存仍按照HashMap方式儲存,但每個entry都額外擁有指向上一個和下一個元素的“指標”。

參考: