(注意:本文基于JDK1.8)
前言
Vector是線程安全的動(dòng)態(tài)數(shù)組類(lèi),提供4個(gè)創(chuàng)建Vector對(duì)象的構(gòu)造方法,接下來(lái)我們逐個(gè)分析每個(gè)創(chuàng)建Vector對(duì)象的構(gòu)造方法
構(gòu)造方法Vector()分析
public Vector() { this(10); }
用于創(chuàng)建Vector對(duì)象的默認(rèn)構(gòu)造方法,此構(gòu)造方法的內(nèi)部會(huì)將數(shù)字10傳入到1個(gè)參數(shù)的構(gòu)造方法中,數(shù)字10代表的是Vector對(duì)象持有的底層數(shù)組對(duì)象的容量
構(gòu)造方法Vector(int)分析
public Vector(int initialCapacity) { this(initialCapacity, 0); }
創(chuàng)建Vector對(duì)象時(shí)可以指定底層數(shù)組的容量,傳入的int參數(shù)表示數(shù)組容量,該構(gòu)造方法的內(nèi)部會(huì)將傳入的initialCapacity和一個(gè)數(shù)字0,又傳入到2個(gè)參數(shù)的構(gòu)造方法中,這個(gè)數(shù)字0代表什么呢?繼續(xù)往下看……
構(gòu)造方法Vecotor(int,int)分析
public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; }
創(chuàng)建Vector對(duì)象的構(gòu)造方法,可以指定數(shù)組默認(rèn)容量、指定數(shù)組的增量值,傳入的參數(shù)initialCapacity表示數(shù)組默認(rèn)容量,傳入的參數(shù)capacityIncrement即表示增量
1、首先調(diào)用基類(lèi)的無(wú)參構(gòu)造方法(子類(lèi)必須至少調(diào)用一個(gè)基類(lèi)的構(gòu)造方法)
2、檢查數(shù)組的初始化容量值
如果initialCapacity小于0,則拋出一個(gè)IllegalArgumentException對(duì)象,IllegalArgumentException對(duì)象接受一個(gè)字符串對(duì)象,這個(gè)字符串對(duì)象會(huì)告知我們發(fā)生異常的原因
3、創(chuàng)建一個(gè)Object數(shù)組對(duì)象(容量為initialCapacity值),由Vector對(duì)象持有的實(shí)例變量elementData負(fù)責(zé)保存該對(duì)象的引用,這個(gè)elementData保存的數(shù)組對(duì)象,就是Vector實(shí)現(xiàn)存儲(chǔ)元素的底層數(shù)組對(duì)象
4、為Vector對(duì)象持有的實(shí)例變量capacityIncrement進(jìn)行賦值,為其賦的值是傳入的局部變量capacityIncrement
這個(gè)capacityIncrement有什么用途呢?原來(lái)這個(gè)值表示數(shù)組擴(kuò)充容量時(shí)的增量,比如現(xiàn)有數(shù)組的容量為10,如果擴(kuò)充增量為5,則下次擴(kuò)充的容量為15
構(gòu)造方法Vector(Collection)分析
public Vector(Collection<? extends E> 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); }
用于創(chuàng)建Vector對(duì)象的構(gòu)造方法,傳入的Collection對(duì)象持有的元素類(lèi)型必須是類(lèi)型參數(shù)E或者類(lèi)型參數(shù)E的子類(lèi),說(shuō)明必須與當(dāng)前Vector對(duì)象持有的元素類(lèi)型保持一致
1、首先將Collection對(duì)象轉(zhuǎn)換為數(shù)組對(duì)象,toArray()方法返回的Object數(shù)組對(duì)象由Vector對(duì)象持有的elementData負(fù)責(zé)保存
2、取出elementData持有的數(shù)組對(duì)象的長(zhǎng)度賦值給Vector對(duì)象持有的elementCount
3、當(dāng)elementData對(duì)象的類(lèi)型不是Object數(shù)組對(duì)象,則通過(guò)Arrays.copyof方法做一次復(fù)制與轉(zhuǎn)換,仍然把轉(zhuǎn)換后的Object數(shù)組對(duì)象由Vector對(duì)象持有的elementData負(fù)責(zé)保存
重要字段介紹(不含基類(lèi)中定義的字段)
3個(gè)實(shí)例變量,創(chuàng)建對(duì)象時(shí)進(jìn)行初始化
capacityIncrement
:表示Vector對(duì)象持有的數(shù)組進(jìn)行擴(kuò)容時(shí)的增量
elementCount
:表示Vector對(duì)象持有實(shí)際元素總數(shù)
elementData
:表示Vector對(duì)象持有的數(shù)組對(duì)象,該數(shù)組實(shí)際負(fù)責(zé)持有元素
2個(gè)靜態(tài)變量,類(lèi)加載時(shí)進(jìn)行初始化
MAX_ARRAY_SIZE
:整型常量,存儲(chǔ)了int最大值-8的一個(gè)值
serialVersionUID
:long類(lèi)型常量,用于Vector對(duì)象序列化。在不同的JDK版本中區(qū)分是否為同一個(gè)Vector類(lèi)
以上就是對(duì)于java中Vector源碼原理分析的詳細(xì)內(nèi)容,更多關(guān)于java中Vector源碼分析的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://blog.csdn.net/cadi2011/article/details/106592728