《JDK原始碼閱讀三》 ArrayList類

2022-04-03 10:29:21 字數 1866 閱讀 2737

1.預設初始容量是10

當新增第乙個元素時,如果 this.elementdata = defaultcapacity_empty_elementdata;那麼預設初始大小設定為10

2.擴容大小為 1.5倍

關鍵**: int newcapacity = oldcapacity + (oldcapacity >> 1);

在arraylist中,有這麼一段**

/**

* the maximum size of array to allocate.

* some vms reserve some header words in an array.

* attempts to allocate larger arrays may result in

* outofmemoryerror: requested array size exceeds vm limit */

private

static

final

int max_array_size = integer.max_value - 8; // 要分配的最大陣列大小

也就是說,arraylist的最大容量只能是整數的最大長度減8,為什麼要減8呢? 其實,**中已經解釋的很清楚了

簡單點來說,就是因為arraylist是乙個陣列物件,他需要一些空間來儲存自己的一些類資訊,,而且這些資訊不能超過8個位元組.

private

void grow(int

mincapacity)

private

static

int hugecapacity(int

mincapacity)

在hugecapacity方法中當mincapacity大於max_array_size時,會返回integer.max_value,不要多想,不是說最大容量可以是達到integer.max_value,

而是會發生異常:請求的陣列大小超過vm限制

3.  addall(int index, collection<? extends e> c)  在某位置把乙個陣列中的所有元素新增到源陣列中

public

boolean addall(int index, collection<? extends e>c)

這個方法的原理其實就是把目標陣列指定下標處目標陣列的末尾之間的元素向後移動,然後把源陣列覆蓋到目標陣列中

在該方法中進行判斷,if

(nummoved > 0

)就是說,如果要插入的位置不在尾端,那麼會將陣列右移,然後再進行插入,否則,直接插入到末尾

4. private boolean batchremove(collection<?> c, boolean complement)  

/**

* 從此列表中刪除指定集合中包含的所有元素

*/public

boolean removeall(collection<?>c)

private

boolean batchremove(collection<?> c, boolean

complement)

finally

// 如果w != size說明陣列進行了修改,即使try塊丟擲異常,也能正確處理異常丟擲前的操作,因為w始終為要儲存的前段部分,陣列也不會因此亂序

// 如果w == size說明陣列未進行更改.

if (w !=size)

}return

modified;

}

JDK1 8原始碼閱讀系列之一 ArrayList

本篇隨筆主要描述的是我閱讀 arraylist 原始碼期間的對於 arraylist 的一些實現上的個人理解,有不對的地方,請指出 先來看一下 arraylist 的繼承圖 由圖可以看出,arraylist 的父類有 abstractlist abstractcollection 所以我從 abst...

JDK原始碼閱讀(三) LinkedHashMap

一 linkedhashmap原理 static class entryextends hashmap.node 二 hashmap分析 1 關鍵的屬性 表示linkedhashmap的頭節點 transient linkedhashmap.entryhead 表示尾節點 transient lin...

JDK 原始碼 閱讀

to be continuing.持續修改中。1.stringbuffer 所處類層次 易忽略點 這個類是執行緒安全的。所有的method直接或間接加synchronized。所以我們如果是單執行緒情況下也考慮到這個會不會影響到效率。當然可能jit可以進行這個優化,待我接下來驗證。預設情況下乙個長為...