Java容器類源碼-Vector的最全的源碼分析(二)

三酵使、源碼解讀

1. 繼承、實(shí)現(xiàn)

extends:AbstractList

implements:List, RandomAccess, Cloneable, java.io.Serializable

2. 全局變量

(1) 存放數(shù)據(jù)的數(shù)組

protected Object[] elementData;

(2) 存放數(shù)量

protected int elementCount;

(3) 容量增量

protected int capacityIncrement;

3. 構(gòu)造方法

(1) 不帶參數(shù)的構(gòu)造方法

public Vector() {

this(10);

}

(2) 帶初始化容量大小的構(gòu)造方法

/**

* @param initialCapacity 初始化容量大小

*/

public Vector(int initialCapacity) {

this(initialCapacity, 0);

}

(3) 帶初始化容量和容量增量的構(gòu)造方法

/**

* @param initialCapacity初始化容量大小

* @param capacityIncrement 容量增量

*/

public Vector(int initialCapacity, int capacityIncrement) {

super();

if (initialCapacity < 0)

throw new IllegalArgumentException("Illegal Capacity: "+

initialCapacity);

this.elementData = new Object[initialCapacity];

this.capacityIncrement = capacityIncrement;

}

(4) 帶Colleciton參數(shù)的構(gòu)造方法

/**

* @param c 將c轉(zhuǎn)為Vector

*/

public Vector(Collection c) {

elementData = c.toArray();

elementCount = elementData.length;

// c.toArray might (incorrectly) not return Object[] (see 6260652)

if (elementData.getClass() != Object[].class)

elementData = Arrays.copyOf(elementData, elementCount, Object[].class);

}

4. 方法

(1) public synchronized void copyInto(Object[] anArray)

源碼解釋:

通過(guò)JNI調(diào)用c++庫(kù)的arraycopy方法瑞信,實(shí)現(xiàn)將anArray數(shù)組復(fù)制到當(dāng)前的Vector柔袁。

public synchronized void copyInto(Object[] anArray) {

System.arraycopy(elementData, 0, anArray, 0, elementCount);

}

(2) public synchronized void trimToSize()

源碼解釋:

用以優(yōu)化Vector的內(nèi)存,我們都知道腰埂,Vector的每次容量增量是當(dāng)前大小的2倍祠挫,但是當(dāng)我們沒(méi)法用完申請(qǐng)的這么多內(nèi)存時(shí)那槽,我們可以通過(guò)調(diào)用這個(gè)方法用以將不需要的內(nèi)存釋放掉。

public synchronized void trimToSize() {

modCount++;// 修改次數(shù)增加

int oldCapacity = elementData.length;// 獲取到當(dāng)前的申請(qǐng)的內(nèi)存大小

if (elementCount < oldCapacity) {// 如果當(dāng)前存放的數(shù)量比申請(qǐng)的內(nèi)存要少

elementData = Arrays.copyOf(elementData, elementCount);// 重新為這個(gè)數(shù)組申請(qǐng)elementCount大小內(nèi)存等舔,并存放這些數(shù)據(jù)

}

}

(3) public synchronized void ensureCapacity(int minCapacity)

源碼解釋:

當(dāng)要擴(kuò)容時(shí)骚灸,會(huì)調(diào)用此方法,保證當(dāng)前容量能存放得下所需要存放的元素?cái)?shù)量慌植。如果不夠時(shí)甚牲,會(huì)調(diào)用grow()方法進(jìn)行擴(kuò)容。

public synchronized void ensureCapacity(int minCapacity) {

if (minCapacity > 0) {

modCount++;

ensureCapacityHelper(minCapacity);

}

}

private void ensureCapacityHelper(int minCapacity) {

// overflow-conscious code

if (minCapacity - elementData.length > 0)

grow(minCapacity);// 如果當(dāng)前容量比數(shù)組的長(zhǎng)度要小時(shí)蝶柿,調(diào)用grow擴(kuò)容

}

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

/**

* Vector的擴(kuò)容方法丈钙, 每次擴(kuò)容至2倍

* @param minCapacity

*/

private void grow(int minCapacity) {

// overflow-conscious code

int oldCapacity = elementData.length;// 獲取到數(shù)組的長(zhǎng)度

int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); //如果沒(méi)有初始化capacityIncrement,則增加至兩倍

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

if (newCapacity - MAX_ARRAY_SIZE > 0)// 如果擴(kuò)容后的容量超過(guò)了最大容量

newCapacity = hugeCapacity(minCapacity);// 調(diào)用hugeCapacity方法

elementData = Arrays.copyOf(elementData, newCapacity);// 將數(shù)組復(fù)制到擴(kuò)容后的新內(nèi)存中去

}

private static int hugeCapacity(int minCapacity) {

if (minCapacity < 0) // overflow

throw new OutOfMemoryError();

return (minCapacity > MAX_ARRAY_SIZE) ?

Integer.MAX_VALUE :

MAX_ARRAY_SIZE;

}

(4) public synchronized void setSize(int newSize)

源碼解釋:

修改容量交汤,當(dāng)newSize比數(shù)組的長(zhǎng)度要大時(shí)著恩,將其復(fù)制到新的內(nèi)存區(qū)域,如果要小的話蜻展,則從newSize位置到數(shù)組的最后一個(gè)位置的所有元素置為空。

public synchronized void setSize(int newSize) {

modCount++;

if (newSize > elementCount) {

ensureCapacityHelper(newSize);

} else {

for (int i = newSize ; i < elementCount ; i++) {

elementData[i] = null;

}

}

elementCount = newSize;

}

(5) public synchronized int capacity()

源碼解釋:

返回?cái)?shù)組長(zhǎng)度邀摆,即申請(qǐng)內(nèi)存的長(zhǎng)度纵顾。

public synchronized int capacity() {

return elementData.length;

}

(6) public synchronized int size()

源碼解釋:

返回?cái)?shù)組已經(jīng)使用的長(zhǎng)度,即存放的數(shù)據(jù)個(gè)數(shù)栋盹。

public synchronized int size() {

return elementCount;

}

(7) public synchronized boolean isEmpty()

源碼解釋:

判空施逾,如果數(shù)量為0,即為empty。

public synchronized boolean isEmpty() {

return elementCount == 0;

}

(8) public Enumeration<E> elements()

源碼解釋:

返回一個(gè)Enumeration對(duì)象的序列汉额。Enumeration只有兩個(gè)方法曹仗,hasMoreElements()和nextElement(),它只能從首個(gè)元素遍歷到最后一個(gè)元素蠕搜,并不能根據(jù)位置拿到具體的元素怎茫。

public Enumeration elements() {

return new Enumeration() {

int count = 0;

public boolean hasMoreElements() {

return count < elementCount;

}

public E nextElement() {

synchronized (Vector.this) {

if (count < elementCount) {

return elementData(count++);

}

}

throw new NoSuchElementException("Vector Enumeration");

}

};

}

(9) public boolean contains(Object o)

源碼解釋:

是否包含對(duì)象o。調(diào)用indexOf判斷是否存在妓灌。

public boolean contains(Object o) {

return indexOf(o, 0) >= 0;

}

public int indexOf(Object o) {

return indexOf(o, 0);

}

(10) public synchronized int indexOf(Object o, int index)

源碼解釋:

判斷o是否為空轨蛤,如果為空,則遍歷是否存在值為空的元素虫埂;不為空祥山,判斷是否存在和o相等的元素。

public synchronized int indexOf(Object o, int index) {

if (o == null) {

for (int i = index ; i < elementCount ; i++)

if (elementData[i]==null)

return i;

} else {

for (int i = index ; i < elementCount ; i++)

if (o.equals(elementData[i]))

return i;

}

return -1;

}

(11) public synchronized int lastIndexOf

源碼解釋:

獲取該元素所處的最后一個(gè)位置掉伏,不存在則返回-1

public synchronized int lastIndexOf(Object o) {

return lastIndexOf(o, elementCount-1);

}

public synchronized int lastIndexOf(Object o, int index) {

if (index >= elementCount)

throw new IndexOutOfBoundsException(index + " >= "+ elementCount);

if (o == null) {

for (int i = index; i >= 0; i--)

if (elementData[i]==null)

return i;

} else {

for (int i = index; i >= 0; i--)

if (o.equals(elementData[i]))

return i;

}

return -1;

}

(12) public synchronized E elementAt(int index)

源碼解釋:

返回這個(gè)位置的元素缝呕。其實(shí)就是判斷數(shù)組的index位置是否有元素

public synchronized E elementAt(int index) {

if (index >= elementCount) {

throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);

}

return elementData(index);

}

E elementData(int index) {

return (E) elementData[index];

}

(13) public synchronized E firstElement()

源碼解釋:

返回?cái)?shù)組第0個(gè)位置的元素。

public synchronized E firstElement() {

if (elementCount == 0) {

throw new NoSuchElementException();

}

return elementData(0);

}

(14) public synchronized E lastElement()

源碼解釋:

返回?cái)?shù)組最后一個(gè)位置的元素斧散。

public synchronized E lastElement() {

if (elementCount == 0) {

throw new NoSuchElementException();

}

return elementData(elementCount - 1);

}

(15) public synchronized void setElementAt(E obj, int index)

源碼解釋:

修改第index位置的值為obj供常。其實(shí)就是數(shù)組賦值。

public synchronized void setElementAt(E obj, int index) {

if (index >= elementCount) {

throw new ArrayIndexOutOfBoundsException(index + " >= " +

elementCount);

}

elementData[index] = obj;

}

每天都在分享文章颅湘,也每天都有人想要我出來(lái)給大家分享下怎么去學(xué)習(xí)Java话侧。大家都知道,我們是學(xué)Java全棧的闯参,大家就肯定以為我有全套的Java系統(tǒng)教程瞻鹏。沒(méi)錯(cuò),我是有Java全套系統(tǒng)教程鹿寨,進(jìn)扣裙【47】974【9726】所示新博,進(jìn)群的時(shí)候記得表明自己想要學(xué)習(xí)什么,不要用小號(hào)脚草,這樣小編才好給你們發(fā)定向資源赫悄,今天小編就免費(fèi)送!~

“我們相信人人都可以成為一個(gè)程序員,現(xiàn)在開始馏慨,找個(gè)師兄埂淮,帶你入門,學(xué)習(xí)的路上不再迷茫写隶。這里是ja+va修真院倔撞,初學(xué)者轉(zhuǎn)行到互聯(lián)網(wǎng)行業(yè)的聚集地。"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慕趴,一起剝皮案震驚了整個(gè)濱河市痪蝇,隨后出現(xiàn)的幾起案子鄙陡,更是在濱河造成了極大的恐慌,老刑警劉巖躏啰,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趁矾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡给僵,警方通過(guò)查閱死者的電腦和手機(jī)毫捣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)想际,“玉大人培漏,你說(shuō)我怎么就攤上這事『荆” “怎么了牌柄?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)侧甫。 經(jīng)常有香客問(wèn)我珊佣,道長(zhǎng),這世上最難降的妖魔是什么披粟? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任咒锻,我火速辦了婚禮,結(jié)果婚禮上守屉,老公的妹妹穿的比我還像新娘惑艇。我一直安慰自己,他們只是感情好拇泛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布滨巴。 她就那樣靜靜地躺著,像睡著了一般俺叭。 火紅的嫁衣襯著肌膚如雪恭取。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天熄守,我揣著相機(jī)與錄音蜈垮,去河邊找鬼。 笑死裕照,一個(gè)胖子當(dāng)著我的面吹牛攒发,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晋南,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼晨继,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搬俊?” 一聲冷哼從身側(cè)響起紊扬,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唉擂,沒(méi)想到半個(gè)月后餐屎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玩祟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年腹缩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片空扎。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡藏鹊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出转锈,到底是詐尸還是另有隱情盘寡,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布撮慨,位于F島的核電站竿痰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏砌溺。R本人自食惡果不足惜影涉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望规伐。 院中可真熱鬧蟹倾,春花似錦、人聲如沸猖闪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)萧朝。三九已至岔留,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間检柬,已是汗流浹背献联。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留何址,地道東北人里逆。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像用爪,于是被迫代替她去往敵國(guó)和親原押。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 童話故事《蘿卜房子》講了這么一個(gè)故事: 一位老爺爺在床底下發(fā)現(xiàn)了一顆蘿卜苗偎血,老爺爺說(shuō):“就讓它長(zhǎng)著吧诸衔,說(shuō)不定能長(zhǎng)出...
    我是長(zhǎng)弓閱讀 20,193評(píng)論 12 50
  • 你說(shuō)盯漂,會(huì)不會(huì)每一顆樹都曾是一只死掉的鹿,它的角自此便站成了永恒的孤獨(dú)笨农。 傳說(shuō)就缆,很久很久以前,是沒(méi)有森林的谒亦。 在一個(gè)...
    夜語(yǔ)寒閱讀 758評(píng)論 0 0
  • 其實(shí)我還是蠻喜歡做服務(wù)行業(yè)的竭宰。 今天晚上繼續(xù)在學(xué)校里的便利店做做兼職。學(xué)校的小商店自然是零食和飲料為主份招。有句老話說(shuō)...
    愚人cc閱讀 315評(píng)論 1 2
  • 早上又是“嗡嗡嗡切揭,嗡嗡嗡”的聲音把我吵醒了。媽媽說(shuō):“咱娘倆還是快出去‘避避難’吧锁摔!這樣我可受不了廓旬!”“好...
    n寧n閱讀 369評(píng)論 0 1