基于java構(gòu)造方法Vector創(chuàng)建對(duì)象源碼分析
(注意:本文基于JDK1.8)
前言
Vector是線程安全的動(dòng)態(tài)數(shù)組類,提供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)用基類的無(wú)參構(gòu)造方法(子類必須至少調(diào)用一個(gè)基類的構(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ì)象持有的元素類型必須是類型參數(shù)E或者類型參數(shù)E的子類,說(shuō)明必須與當(dāng)前Vector對(duì)象持有的元素類型保持一致
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ì)象的類型不是Object數(shù)組對(duì)象,則通過(guò)Arrays.copyof方法做一次復(fù)制與轉(zhuǎn)換,仍然把轉(zhuǎn)換后的Object數(shù)組對(duì)象由Vector對(duì)象持有的elementData負(fù)責(zé)保存
重要字段介紹(不含基類中定義的字段)
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)變量,類加載時(shí)進(jìn)行初始化
MAX_ARRAY_SIZE
:整型常量,存儲(chǔ)了int最大值-8的一個(gè)值
serialVersionUID
:long類型常量,用于Vector對(duì)象序列化。在不同的JDK版本中區(qū)分是否為同一個(gè)Vector類
以上就是對(duì)于java中Vector源碼原理分析的詳細(xì)內(nèi)容,更多關(guān)于java中Vector源碼分析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java string類型轉(zhuǎn)換成map代碼實(shí)例
這篇文章主要介紹了Java string類型轉(zhuǎn)換成map代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03springboot項(xiàng)目接入第三方qq郵箱驗(yàn)證登錄的全過(guò)程
互聯(lián)網(wǎng)發(fā)展到現(xiàn)在,相必大家都知道發(fā)送郵件應(yīng)該是網(wǎng)站的必備功能之一,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目接入第三方qq郵箱驗(yàn)證登錄的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04如何使用ThreadLocal上下文解決查詢性能問(wèn)題
這篇文章主要介紹了利用ThreadLocal上下文解決查詢性能問(wèn)題,有兩種解決方案,一種是使用ThreadLocal上下文,另一種是使用Redis緩存,需要的朋友可以參考下2023-07-07Spring?Boot?@Autowired?@Resource屬性賦值時(shí)機(jī)探究
這篇文章主要為大家介紹了Spring?Boot?@Autowired?@Resource屬性賦值時(shí)機(jī),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07MyBatis接口的簡(jiǎn)單實(shí)現(xiàn)原理分析
這里僅僅舉個(gè)簡(jiǎn)單例子來(lái)說(shuō)明原理,不是完全針對(duì)MyBatis的,這種思想我們也可以應(yīng)用在其他地方。地mybatis接口實(shí)現(xiàn)原理感興趣的朋友一起看看吧2017-07-07