JAVA中ArrayList原始碼分析

2021-08-20 12:08:42 字數 3224 閱讀 6879

本文將會從5個方面來介紹

arraylist

的原始碼。其中涉及到了

arraylist

是如何實現資料的存貯,

arraylist

為什麼可以隨著元素的新增而增加容量以及它的容量是如何擴充的與元素個數有什麼關係,是如何判斷併發修改異常。

a:

arraylist

類的屬性

:/*** 集合的預設容量為10;當我們建立乙個集合時,如下

* arraylist

list=new arraylist

();* list.add("

aaaa

");* 此時新增元素時集合會擴充容量達到預設值10

* 在e項的基本方法中我會講解add方法便可知道為什麼集合的容量會

*是10了。

*/

private static final int default_capacity = 10;

/*** 集合為空的狀態。當我們建立乙個集合時,如下

* arraylist

list=new arraylist

();* 此時集合的狀態便是同下面一樣。至於為什麼會在b項構造方法中講解

*/private static final object empty_elementdata = {};

/*** 集合容器的本質,集合之所以可以存放各種元素,是因為它把元素都存在

*了這個物件陣列中

* 在c項中我們會講解,為什麼集合可以變長,他是如何增加自身容量的

*/private transient object elementdata;

/*** 集合中元素個數,要與集合的容量區分開。比如集合容量是10,但裡面*只存

*放了乙個元素,則size為1

*/private int size;

/*** 集合的最大容量,至於為什麼是整型最大值

-8還沒搞明白

*/private static final int max_array_size = integer.max_value - 8;

/*** 這不是arraylist類中的成員變數,是它的父類abstractlist的成員

*變數,用來記錄

* 操作集合的次數。但是,只有在集合結構發生變化時modcount才會增長。

* 也就是說對集合做增加,刪除操作會使這個變數值增加

* 他是判斷concurrentmodificationexception併發修改異常的依據

* 在d項中我會介紹到

*/protected transient int modcount = 0;

b:

arraylist

的構造方法:

arraylist有三種構造方法乙個無參的,兩個有參的。其本質都是對物件陣列的操作。

/*** arraylist集合的無參構造方法。當我們建立集合時不指定引數將

*呼叫此方法,如下

* arraylist list=new arraylist();

* 期內部this.elementdata = empty_elementdata;

* 等於object elementdata={};

* 因為如a項中所說empty_elementdata是乙個空陣列,

* 所以elementdata在賦值之後也是乙個空陣列

*/public arraylist()

/*** 用指定集合初始化arraylist集合

* 內部的本質依舊是操作物件陣列陣列

*/public arraylist(collection extends e> c)

/*** 設定集合容量為最大容量,即整型的最大值

*/private static int hugecapacity(int mincapacity) catch (indexoutofbound***ception ex) {

throw new concurrentmodificationexception();

/*** 檢查是否有併發修改異常

*/final void checkforcomodification() {

if (modcount != expectedmodcount)

throw new concurrentmodificationexception();

e:

arraylist

的基本方法:

/*** 向集合中新增元素

* 其本質就是向物件陣列中新增乙個元素

* 當我們向乙個剛建立出來的集合中新增元素

* ensurecapacityinternal(size + 1);

* 會判斷集合的容量並增加集合的容量,如在上面所述的c項中,

* 如果集合為空會預設先增加10的容量,

* 所以向乙個空的集合中插入 資料,集合會增加10的預設容量

* * 由上面的d項所述可知,當集合發生了結構性變化時modcount會增加。

* modcount隱藏在了ensurecapacityinternal(size + 1);這個方法內*部

*/public boolean add(e e) {

ensurecapacityinternal(size + 1);  

elementdata[size++] = e;

return true;

/*** 移出指定位置的元素

* 本質還是操縱陣列

* modcount++;集合發生了結構性變化

* 當元素被移出時結合的容量不會發生變化

*/public e remove(int index) {

rangecheck(index);

modcount++;

e oldvalue = elementdata(index);

int nummoved = size - index - 1;

if (nummoved > 0)

system.arraycopy(elementdata, index+1, elementdata, index,nummoved);

elementdata[--size] = null;

return oldvalue;

java中list和ArrayList的區別

之前自己具體寫 的時候一般會使用到arraylist和linkedlist,經常忽略了arraylist和list的區別 今天特意翻了一小會兒資料,算是解除了這個小疑惑。list是乙個介面,而arraylist是list介面的乙個實現類。arraylist類是繼承abstractlist抽象類和實現...

Java中的ArrayList的容量

list介面的大小可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。arraylist繼承於list介面,除繼承過來的方法外,還提供一些方法來操作內部用來儲存列表的陣列的大小。每個arraylist例項都有乙個容量。該容量是指用來儲存列表元素的陣列的大小。它總是至少等於列...

Java中的ArrayList的容量

list介面的大小可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。arraylist繼承於list介面,除繼承過來的方法外,還提供一些方法來操作內部用來儲存列表的陣列的大小。每個arraylist例項都有乙個容量。該容量是指用來儲存列表元素的陣列的大小。它總是至少等於列...