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