ArrayList底層原始碼

2021-09-29 02:04:20 字數 3626 閱讀 9668

arraylist的屬性

private static final int default_capacity = 10;

//預設初始容量的大小

private static final object empty_elementdata = {};

//空陣列,用於有參構造時引數為零的例項

private static final object defaultcapacity_empty_elementdata = {};

//用於無參構造時的例項

transient object elementdata;

// 儲存arraylist資料的陣列

private int size;

//arraylist所含元素個數

arraylist的構造方法

帶初始引數的構造方法

public arraylist(int initialcapacity) else if (initialcapacity == 0) else

}不帶初始引數的構造方法

public arraylist()

arraylist的擴容

public void ensurecapacity(int mincapacity) 

}//得到最小擴容量

private void ensurecapacityinternal(int mincapacity)

//否則直接去判斷是否需要擴容

ensureexplicitcapacity(mincapacity);

}//判斷是否需要擴容

private void ensureexplicitcapacity(int mincapacity)

/*** 要分配的最大陣列大小

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

/*** arraylist擴容的核心方法。

*/private void grow(int mincapacity)

//比較mincapacity和 max_array_size

private static int hugecapacity(int mincapacity)

arraylist的其他方法

//返回此列表中的元素數。 

public int size()

// 如果此列表不包含元素,則返回 true 。

public boolean isempty()

/*** 如果此列表包含指定的元素,則返回true 。

*/public boolean contains(object o)

/***返回此列表中指定元素的首次出現的索引,如果此列表不包含此元素,則為-1

*/public int indexof(object o) else

return -1;

}/**

* 返回此列表中指定元素的最後一次出現的索引,如果此列表不包含元素,則返回-1。.

*/public int lastindexof(object o) else

return -1;

}/**

* 返回此arraylist例項的淺拷貝。 (元素本身不被複製。)

*/public object clone() catch (clonenotsupportedexception e)

}/**

*以正確的順序(從第乙個到最後乙個元素)返回乙個包含此列表中所有元素的陣列。

*返回的陣列將是「安全的」,因為該列表不保留對它的引用。 (換句話說,這個方法必須分配乙個新的陣列)。

*因此,呼叫者可以自由地修改返回的陣列。 此方法充當基於陣列和基於集合的api之間的橋梁。

*/public object toarray()

arraylist對元素的操作

/**

* 返回此列表中指定位置的元素。

*/public e get(int index)

/*** 用指定的元素替換此列表中指定位置的元素。

*/public e set(int index, e element)

/*** 將指定的元素追加到此列表的末尾。

*/public boolean add(e e)

/*** 在此列表中的指定位置插入指定的元素。

*先呼叫 rangecheckforadd 對index進行界限檢查;然後呼叫 ensurecapacityinternal 方法保證capacity足夠大;

*再將從index開始之後的所有成員後移乙個位置;將element插入index位置;最後size加1。

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

/*** 刪除該列表中指定位置的元素。 將任何後續元素移動到左側(從其索引中減去乙個元素)。

*/public e remove(int index)

/*** 從列表中刪除指定元素的第乙個出現(如果存在)。 如果列表不包含該元素,則它不會更改。

*返回true,如果此列表包含指定的元素

*/public boolean remove(object o)

} else

}return false;}/*

* private remove method that skips bounds checking and does not

* return the value removed.

*/private void fastremove(int index)

/*** 從列表中刪除所有元素。

*/public void clear()

/*** 按指定集合的iterator返回的順序將指定集合中的所有元素追加到此列表的末尾。

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

/*** 將指定集合中的所有元素插入到此列表中,從指定的位置開始。

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

/*** 從此列表中刪除所有索引為fromindex (含)和toindex之間的元素。

*將任何後續元素移動到左側(減少其索引)。

*/protected void removerange(int fromindex, int toindex)

size = newsize;

}/**

* 檢查給定的索引是否在範圍內。

*/private void rangecheck(int index)

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

*/public boolean removeall(collection<?> c)

/*** 僅保留此列表中包含在指定集合中的元素。

*換句話說,從此列表中刪除其中不包含在指定集合中的所有元素。

*/public boolean retainall(collection<?> c)

那麼copyof()和arraycopy區別是什麼?

ArrayList底層原始碼學習

主要為add,get,set,remove,indexof,陣列擴容等內容的學習。擴容 擴容前提 size elementdata.length,也就是元素個數達到了陣列容器的長度。建立新的更大空間的 如size 2 1 陣列物件,object newarray new object size 2 ...

ArrayList底層原始碼實現練習

created by chengbx on 2018 5 17.自己實現乙個arraylist,幫助我們更好的理解arraylist的底層結構!一句話概括arraylist的底層 陣列的擴容與資料的拷貝!public class cbxarraylist public cbxarraylist in...

ArrayList原始碼分析

arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...