1. 程式人生 > 實用技巧 >Vector集合最全面的原始碼分析

Vector集合最全面的原始碼分析

二, 單點突破

2.1,建構函式

2.1.1 ,初始容量為10

public Vector() {
this(10);//初始容量為10
}

2.1.2,看下初始容量是怎麼分配的?

(1) 第一步,呼叫了這個方法
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}(2)第二步呼叫下面的這個方法
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)//首先先檢查初始容量是否小於0,若小於0,則丟擲異常提示,因為陣列空間大小分配不能小於0呀
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];//建立一個容量大小為initialCapacity的陣列,賦值給成員變數elementData
this.capacityIncrement = capacityIncrement;//這裡的capacityIncrement大小為0
}

2.2,add() 方法

public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);//首先檢查集合裡是否還有剩餘空間盛下元素e,若沒有,則需要進行擴容操作
elementData[elementCount++] = e;//將元素e新增到集合的最後一個位置,elementCount值增加1
return true;//預設新增元素成功
}

2.3,size()方法

public synchronized int size() {
return elementCount;//elementCount是個成員變數,用作記錄集合元素大小的變數,呼叫size()方法時就是統計這個值的大小
}

2.4,isEmpty()方法

public synchronized boolean isEmpty() {
return elementCount == 0;//判斷集合是否為空時,就是判斷elementCount是否等於零
}

2.5,get()方法

public synchronized E get(int index) {//這個方法就是索引下標獲取集合對應的元素
if (index >= elementCount)//首先我們要檢查一下index是否大於集合的elementCount大小,因為大於了,說明越界了嘛
throw new ArrayIndexOutOfBoundsException(index);

return elementData(index);
}
(2)//呼叫elementData()方法
E elementData(int index) {
return (E) elementData[index];//根據陣列的特點,通過索引下標找到指定索引位置的元素
}

2.6,clear()方法

public void clear() {
removeAllElements();//這是第一步操作
}

public synchronized void removeAllElements() {
modCount++;
// Let gc do its work
for (int i = 0; i < elementCount; i++){
//迴圈遍歷整個集合,將集合中的每個元素置為null,這樣java虛擬機器就會在某個時間點觸發垃圾回收機制(gc)進行回收
elementData[i] = null;
}

elementCount = 0;//最後將代表集合元素大小的成員變數elementCount的值置為零
}

2.7,contains()方法

public boolean contains(Object o) {//判斷集合裡面是否包含元素的方法也是很常用的
return indexOf(o, 0) >= 0;
}

public synchronized int indexOf(Object o, int index) {
if (o == null) {//因為集合裡面的元素可能為null,這裡就分兩種情況進行處理了,首先先判斷元素o是否為null
for (int i = index ; i < elementCount ; i++)//迴圈遍歷集合,對每個元素進行判斷,時間複雜度為O(n)
if (elementData[i]==null)
return i;//返回元素o在集合(即陣列)的索引下標位置
} else {
for (int i = index ; i < elementCount ; i++)
//這裡也是對集合的每個元素進行判斷,這裡的o不會為null,所以可以直接o.equals()呼叫
//,如果o為null,這裡呼叫就會出現空指標異常了,切記這一點
if (o.equals(elementData[i]))
return i;
}
return -1;//若兩種情況都分析完了,還是找不到,就直接返回-1,indexOf(o,0)>=0若返回-1,說明集合不包含元素o唄
}

2.8,remove()方法

public boolean remove(Object o) {    return removeElement(o);
}
(2) 第二步操作
public synchronized boolean removeElement(Object obj) {
modCount++;
int i = indexOf(obj);//首先通過indexof()找到元素obj在集合元素中的下標位置,若找不到則表示待刪除的元素obj不存在唄
if (i >= 0) {
removeElementAt(i);//刪除指定位置的元素
return true;
}
return false;//表示元素obj不在集合中
}
(3)第三步操作
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) {
//首先也要判斷索引下標是否大於等於集合元素個數,因為索引下標是從0開始的,所以最大下標為size()-1
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
//若index小於0,此時也不符合,就會出現索引越界的情況,此時丟擲索引越界的異常就可以了,
//由程式的呼叫者自己去避免這種問題
throw new ArrayIndexOutOfBoundsException(index);
}
//如果陣列元素被刪除後,集合裡面的元素就要移動
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
//集合元素個數減一
elementCount--;
elementData[elementCount] = null; /* to let gc do its work */ //此時已經標明這裡要觸發gc機制了
}

2.8,capacity()方法

public synchronized int size() {
return elementCount;//返回集合容量大小,而不是集合元素個數
}

2.9,firstElement()方法

public synchronized E firstElement() {
if (elementCount == 0) {//首先判斷集合元素個數是否大於0,等於0表示集合裡沒有元素嘛
throw new NoSuchElementException();//直接丟擲對應的異常
}
return elementData(0);//根據陣列的特點,根據索引下標位置獲取對應元素
}

2.10,lastElement()

public synchronized E lastElement() {
if (elementCount == 0) {//首先判斷集合元素個數是否大於0,等於0表示集合裡沒有元素嘛
throw new NoSuchElementException();
}
return elementData(elementCount - 1);//根據陣列的特點,根據索引下標位置獲取對應元素
}

2.11,elementAt()方法

public synchronized E elementAt(int index) {
if (index >= elementCount) {//預檢查機制
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}

return elementData(index);//根據陣列的索引下標獲取集合裡指定位置的元素
}

三,總結一下

3.1,方法總結

對於每個方法,去理解具體的實現原理,學會如何分析一個方法,這樣可以幫你更加去編寫可讀性高,具備可擴充套件的程式碼有所幫助,其實,現在我寫內容也幫助了自己很多,如果幫助到需要的你,那就再好不過了,喜歡的幫忙轉發一下(感謝)

本文分享自微信公眾號 - WwpwW(gh_245290c1861a)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

來源:包頭SEO