一、List介面有三個常用的集合(ArrayList、Vector、LinkedList)
ArrayList注意事項
- ArrayList底層是用陣列來實現資料儲存的 底層是 transient Object[ ] elementdata 是一個Object型別的陣列
- 這個 transient 意思是:短暫的,瞬間的 用這個關鍵字修飾表示 該屬性不會序列化,解釋:有些屬性不需要被序列化,比如一些敏感的資訊,銀行卡密碼等,一些隱私,可以用transient
- ArrayList基本等同於Vector,ArrayList是執行緒不安全的,但效率高,在多執行緒的情況下,不建議使用ArrayList
ArrayList的原始碼分析
- ArrayList底層是一個陣列
- ArrayList有兩個構造器:1、一個是無參的。 2、一個是有參的構造器傳入一個int型別的值,指定ArrayList陣列的大小
- 當建立ArrayList物件時,呼叫無參構造器,則初始化陣列大小為10 也就是把 elementdata 初始化 = 10。 當新增到第11個的時候,會對陣列進行擴容, 會按照 elementdata 的1.5倍擴容。 如果15個空間用完,則會以15的1.5倍擴容。從此類推,如果沒給值,預設的就是null。
- 當建立ArrayList物件時,呼叫有參構造器,會傳入一個int值,指定陣列大小。假設傳入的是8,則 elementdata = 8 如果超過8個,就擴容,則是 8的1.5倍。類推,沒有資料預設為null。
Vector
- Vector底層也是一個物件陣列
- Vector底層和Arraylist幾乎相同,就是一個執行緒安全,一個執行緒不安全
- Vector是執行緒同步的,即執行緒安全,Vector操作方法有Synchoronized
-
public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; }
ArrayList和Vector的區別
LinkedList介紹
- LinkedList底層維護了一個雙向連結串列
- 可以新增任何元素,元素可以重複,包括null
- 執行緒不安全,沒有實現同步
LinkedList的底層分析
-
LinkedList 是一個繼承於AbstractSequentialList的雙向連結串列。它也可以被當作堆疊、佇列或雙端佇列進行操作。
- LinkedList中維護了兩個屬性:一個是first和last分別指向首屆點和尾節點
- 每一個節點裡面有一個Node物件,裡面有維護了prev,next,item三個屬性,其中通過prev指向指向前一個節點,通過next指向後一個節點。最終實現雙向連結串列
- 所以LInkedList的元素新增和刪除,不是通過陣列完成的,相對來說效率比較高
ArrayList和LinkedList區別