ArrayList的底層實現原理

2021-08-28 06:43:08 字數 4504 閱讀 8847

一、對於arraylist需要掌握的七點內容

二、原始碼分析

2.1、arraylist的建立(常見的兩種方式)

liststrlist = new arraylist();

liststrlist2 = new arraylist(2);

arraylist源**:

基本屬性:

//物件陣列:arraylist的底層資料結構

private transient object elementdata;

//elementdata中已存放的元素的個數,注意:不是elementdata的容量

private int size;

注意:

arraylist構造器:

/**

* 建立乙個容量為initialcapacity的空的(size==0)物件陣列

*/public arraylist(int initialcapacity)

if (initialcapacity < 0)

throw new illegalargumentexception("illegal capacity:" + initialcapacity);

this.elementdata = new object[initialcapacity];

}/**

* 預設初始化乙個容量為10的物件陣列

*/public arraylist() 構造器

}

在我們執行new arraylist()時,會呼叫上邊的無參構造器,創造乙個容量為10的物件陣列。

在我們執行new arraylist(2)時,會呼叫上邊的public arraylist(int initialcapacity),創造乙個容量為2的物件陣列。

注意:

protected abstractlist()

2.2、往arraylist中新增物件(常見的兩個方法add(e)和addall(collection<? extends e> c))

2.2.1、add(e)

strlist2.add("hello");
arraylist源**:

/**

* 向elementdata中新增元素

*/public boolean add(e e)

/**

* 確保陣列的容量足夠存放新加入的元素,若不夠,要擴容

*/public void ensurecapacity(int mincapacity)

}

在上述**的擴容結束後,呼叫了arrays.copyof(elementdata, newcapacity)方法,這個方法中:對於我們這裡而言,先建立了乙個新的容量為newcapacity的物件陣列,然後使用system.arraycopy()方法將舊的物件陣列複製到新的物件陣列中去了。

注意:2.2.2、addall(collection<? extends e> c)

使用方式:

liststrlist = new arraylist();

strlist.add("jigang");

strlist.add("nana");

strlist.add("nana2");

liststrlist2 = new arraylist(2);

strlist2.addall(strlist);

源**:

/**

* 將c全部加入elementdata

*/public boolean addall(collection<? extends e> c)

/**

* 確保陣列的容量足夠存放新加入的元素,若不夠,要擴容

*/public void ensurecapacity(int mincapacity)

}

注意:

2.2.3、add(int index, e element)

/**

* 在特定位置(只能是已有元素的陣列的特定位置)index插入元素e

*/public void add(int index, e element)

/** * 檢查索引index是否超出size-1

*/private void rangecheck(int index)

2.3、獲取arraylist中的單個物件(get(int index))

實現方式:

arrayliststrlist2 = new arraylist(2);

strlist2.add("hello");

strlist2.add("nana");

strlist2.add("nana2");

system.out.println(strlist2.get(0));

源**:

/** * 按照索引查詢物件e

*/public e get(int index)

/** * 檢查索引index是否超出size-1

*/private void rangecheck(int index)

2.4、刪除arraylist中的物件

2.4.1、remove(object o)

使用方式:

strlist2.remove("hello");

源**:

/*** 從前向後移除第乙個出現的元素o

*/public boolean remove(object o)

} else

}return false;}/*

* 刪除單個位置的元素,是arraylist的私有方法

*/private void fastremove(int index)

2.4.2、remove(int index)

使用方式:

strlist2.remove(0);
源**:

/**

* 刪除指定索引index下的元素,返回被刪除的元素

*/public e remove(int index)

/* * 刪除單個位置的元素,是arraylist的私有方法

*/private void fastremove(int index)

注意:

2.5、判斷物件是否存在於arraylist中(contains(e)

源**:

/**

* 判斷動態陣列是否包含元素o

*/public boolean contains(object o)

/*** 返回第乙個出現的元素o的索引位置

*/public int indexof(object o) else

return -1;//若不包含,返回-1

}/**

* 返回最後乙個出現的元素o的索引位置

*/public int lastindexof(object o) else

return -1;

}

2.6、遍歷arraylist中的物件(iterator())

使用方式:

liststrlist = new arraylist();

strlist.add("jigang");

strlist.add("nana");

strlist.add("nana2");

iteratorit = strlist.iterator();

while (it.hasnext())

源**:iterator()方法是在abstractlist中實現的,該方法返回abstractlist的乙個內部類itr物件

public iteratoriterator()
itr:

private class itr implements iterator

//獲取元素

public e next() catch (indexoutofbound***ception e)

}//檢測在遍歷的過程中,是否發生了add、remove等操作

final void checkforcomodification()

}

遍歷的整個流程結合"使用方式"與"itr的注釋"來看。注:上述的itr我去掉了乙個此時用不到的方法和屬性。

三、總結

ArrayList底層實現

modifier and type method and description boolean add e e 將指定的元素追加到此列表的末尾 void add int index,e element 在此列表中的指定位置插入指定的元素。boolean addall collection exte...

ArrayList的底層實現

1 底層是object陣列,叫做 elementdata 2 預設容量10,叫做 default capacity,不是初始容量 3 如果不指定初始容量,剛new出來的list如果沒有儲存任何物件,則容量為0,但是如果指定了初始容量,剛開始size也是為0 arraylistlist new arr...

Java集合中ArrayList的實現原理

arraylist是list介面的可變陣列的實現。每個arraylist例項都有乙個容量,該容量是指用來儲存列表元素的陣列的大小。隨著向arraylist中不斷新增元素,其容量也自動增長。自動增長會帶來資料向新陣列的重新拷貝,在新增大量元素前,應用程式也可以使用ensurecapacity操作來增加...