8 arraylist

cathy_mu發表於2021-06-07

arraylist執行緒不安全
底層是陣列
支援快速訪問randomAccess
尾部有空餘空間
在尾增加刪除時間複雜度都是O(1),在指定位置增加刪除時間複雜度是O(n),因為要一個一個挪
JDK7 new無參構造的ArrayList物件時,直接建立了長度是10的Object[]陣列elementData 。jdk7中的ArrayList的物件的建立類似於單例的餓漢式,而jdk8中的ArrayList的物件的建立類似於單例的懶漢式。
(餓漢:類載入時就初始化,懶漢:第一次呼叫時才初始化)

擴容過程
未指定初始容量的arraylist建立出來,容量是0
add元素進來時,判斷內部容量是否足夠(內部容量>當前size+1)
判斷內部容量是否足夠n時,如果arraylist是空的,將容量擴充到max(10,n),如果arraylist不是空的,看看容量夠不夠n,不夠就擴容到n
擴容到n時,利用位運算將舊容量擴容到1.5倍,新容量=max(1.5倍舊容量,n)。
如果max(1.5倍舊容量,n)>maxInteger-8 && n>maxInteger-8,新容量=maxInteger
如果max(1.5倍舊容量,n)>maxInteger-8 && n<maxInteger-8,新容量=maxInteger-8

java 中的 length屬性是針對陣列說的,比如說你宣告瞭一個陣列,想知道這個陣列的長度則用到了 length 這個屬性.
java 中的 length() 方法是針對字串說的,如果想看這個字串的長度則用到 length() 這個方法.
java 中的 size() 方法是針對泛型集合說的,如果想看這個泛型有多少個元素,就呼叫此方法來檢視!

在此列表中的指定位置插入指定的元素。
先呼叫 rangeCheckForAdd 對index進行界限檢查;然後呼叫 ensureCapacityInternal 方法保證capacity足夠大;
再將從index開始之後的所有成員後移一個位置;將element插入index位置;最後size加1。

System.arraycopy()是一個 native 方法,用來add的時候一個一個挪

 /**
*   複製陣列
* @param src 源陣列
* @param srcPos 源陣列中的起始位置
* @param dest 目標陣列
* @param destPos 目標陣列中的起始位置
* @param length 要複製的陣列元素的數量
*/
public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);
                                    

把src陣列,在第srcPos位置插入新資料,後邊的挨個挪一個

Arrays.copyOf()方法 申請一個新的陣列。呼叫System.arraycopy,將源陣列中的資料進行複製,並返回新的陣列

ensureCapacity方法,如有必要,增加此 ArrayList 例項的容量,以確保它至少可以容納由minimum capacity引數指定的元素數。最好在 add 大量元素之前用 ensureCapacity 方法,以減少增量重新分配的次數

相關文章