1. ArrayList的繼承結(jié)構(gòu)圖
從繼承結(jié)構(gòu)圖中可以看出來(lái),,一般的設(shè)計(jì)都會(huì)是List接口定義所有的API接口,然后用抽象類AbstractList來(lái)實(shí)現(xiàn)常用的API接口,然后在實(shí)現(xiàn)類中定義具體的實(shí)現(xiàn);
接口 ==> 抽象類 ==> 類
圖中,ArrayList卻去實(shí)現(xiàn)了List ,collection 的作者Josh說(shuō)他寫這代碼的時(shí)候覺(jué)得這個(gè)會(huì)有用處,但是其實(shí)并沒(méi)什么用垦缅,但因?yàn)闆](méi)什么影響季率,就一直留到了現(xiàn)在表牢。
2.ArrayList 的成員變量
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
//序列化和反序列化id
private static final long serialVersionUID = 8683452581122892189L;
/**
* 默認(rèn)初始化容量
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 指定該ArrayList容量為0時(shí),返回該空數(shù)組工育。
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* 當(dāng)調(diào)用無(wú)參構(gòu)造方法港准,返回的是該數(shù)組。
* 它與EMPTY_ELEMENTDATA的區(qū)別就是:該數(shù)組是默認(rèn)返回的机久,而EMPTY_ELEMENTDATA是在用戶指定容量為0時(shí)返回。
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* 存放數(shù)據(jù)的數(shù)組
*/
transient Object[] elementData; // non-private to simplify nested class access
/**
* ArrayList的實(shí)際大小
*/
private int size;
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* ArrayList的最大容量; -8 是因?yàn)镴VM在數(shù)組中保留一些header赔嚎。
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
3. ArrayList 的構(gòu)造方法
3.1 無(wú)參構(gòu)造器
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
}
當(dāng)我們通過(guò) ArrayList<String> arrayList = new ArrayList<>(); 時(shí), 會(huì)將常量數(shù)組對(duì)象DEFAULTCAPACITY_EMPTY_ELEMENTDATA賦值給 elementData 對(duì)象數(shù)組;
因?yàn)槭褂玫娇諛?gòu)造的情況很多,所以將DEFAULTCAPACITY_EMPTY_ELEMENTDATA定義為常量,主要為了節(jié)約空間
3.2 帶容量的構(gòu)造器
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public ArrayList(int initialCapacity) {
// 如果指定的容量大于0, 創(chuàng)建一個(gè)對(duì)象數(shù)組,指定容量為傳入的參數(shù),并賦值給elementData
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
// 如果指定的容量為0的話,將空的對(duì)象數(shù)組EMPTY_ELEMENTDATA賦值給elementData
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
//參數(shù)異常
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
}
3.3 帶集合的構(gòu)造器
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public ArrayList(Collection<? extends E> c) {
//將集合轉(zhuǎn)化為數(shù)組,賦值給elementData
elementData = c.toArray();
// 若數(shù)組elementData的長(zhǎng)度不等于0
if ((size = elementData.length) != 0) {
//每個(gè)集合的toarray()的實(shí)現(xiàn)方法不一樣膘盖,所以需要判斷一下,如果不是Object[].class類型尤误,那么就需要使用ArrayList中的方法去改造一下侠畔。
if (elementData.getClass() != Object[].class)
//將傳入的數(shù)組賦值給elementData
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// 若數(shù)組elementData的長(zhǎng)度等于0
this.elementData = EMPTY_ELEMENTDATA;
}
}
}
4. ArrayList 的常用方法
4.1 add(E e)方法
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e; //在數(shù)組的末尾增加元素
return true;
}
private void ensureCapacityInternal(int minCapacity) {
//minCapacity: 添加元素過(guò)后,ArrayList的大小
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//獲取ArrayList的最大容量
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
//如果ArrayList為空,則表示數(shù)組未初始化,則返回DEFAULT_CAPACITY
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++; // 記錄操作數(shù)
// 若數(shù)組的容量大于了數(shù)組的長(zhǎng)度,就擴(kuò)容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
// 擴(kuò)容, 擴(kuò)容1.5倍,并賦值為新的數(shù)組
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
4.2 add(int index, E element)方法
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public void add(int index, E element) {
rangeCheckForAdd(index); // 校驗(yàn)數(shù)組下標(biāo)
ensureCapacityInternal(size + 1); // Increments modCount!!
//將指定元素插入到列表中的指定位置。將當(dāng)前位于該位置的元素(如果有的話)和隨后的任何元素向右移動(dòng)袄膏。
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
4.3 remove(int index)方法
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public E remove(int index) {
rangeCheck(index); // 檢查下標(biāo)
modCount++;
E oldValue = elementData(index); //舊值
int numMoved = size - index - 1; // 刪除過(guò)后,后面要移動(dòng)的元素個(gè)數(shù)
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work 將最后的一個(gè)元素置空
return oldValue; // 返回刪除的值
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
4.4 remove(Object o)方法
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public boolean remove(Object o) {
//ArrayList可以存放null
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index); // 刪除第一次出現(xiàn)的元素,后面元素前移
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index); // 刪除第一次出現(xiàn)的元素,后面元素前移
return true;
}
}
return false;
}
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
}
}
4.5 set(int index, Object o)方法
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public E set(int index, E element) {
rangeCheck(index);.// 檢查數(shù)組下標(biāo)
E oldValue = elementData(index);// 獲取舊值
elementData[index] = element; //賦值新值
return oldValue; //返回舊值
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
4.6 E get(int index)方法
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public E get(int index) {
rangeCheck(index);// 檢查數(shù)組索引
return elementData(index);//返回索引對(duì)應(yīng)的元素
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
4.7 clear()方法
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public void clear() {
modCount++;
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
}