Collection容器家族(Vector講解及Stack原始碼詳解)
Vector講解
Vector類稱作向量類,它實現了動態陣列,用於元素數量變化的物件陣列。像陣列一樣,vector類也用從0開始的下標表示元素的位置;但和陣列不同的是,當vector物件建立後,陣列的元素個數會隨著vector物件元素個數的增大和縮小而自動變化。
Vector的資料結構和ArrayList差不多,它包含了3個成員變數:elementData , elementCount, capacityIncrement。
(01) elementData 是"Object[]型別的陣列",它儲存了新增到Vector中的元素。elementData是個動態陣列,如果初始化Vector時,沒指定動態陣列的>大小,則使用預設大小10。隨著Vector中元素的增加,Vector的容量也會動態增長,capacityIncrement是與容量增長相關的增長係數,具體的增長方式,請參考原始碼分析中的ensureCapacity()函式。
(02) elementCount 是動態陣列的實際大小。
(03) capacityIncrement 是動態陣列的增長係數。如果在建立Vector時,指定了capacityIncrement的大小;則,每次當Vector中動態陣列容量增加時>,增加的大小都是capacityIncrement。
但由於它底層資料結構是陣列、查詢快、增刪滿、執行緒不安全,所以不經常使用,通常使用ArrayList代替它。
Stack類詳解
一、Stack繼承的父類、介面及概述
Stack類,作為java對棧結構的實現,具有先進後出、後進先出的特點。它的實現方式是基於Vector集合類實現的,Stack類自己本身有5個棧的常用方法(壓棧、出棧、檢視棧頂元素、判斷棧是否為空、查詢棧內指定元素),除了這幾個方法外,他還可以使用其父類Vector類的公共方法。但是對於一個棧,基本的的壓棧出棧查詢元素就足夠了。
二、方法詳解
1.進棧方法 push(E item)
/**
* 功能:進棧
* 實現:呼叫父類Vector的addElement方法在陣列尾部新增元素
*/
public E push(E item) {
addElement(item);
return item;
}
2.出棧 pop()
/** * 功能:出棧 * 實現:呼叫父類的removeElementAt移除並返回陣列尾部的元素 */ public synchronized E pop() { E obj; int len = size(); obj = peek(); removeElementAt(len - 1); return obj; }
3.檢視棧頂元素 peek()
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
4.判斷棧是否為空 isEmpty()
public boolean empty() {
return size() == 0;
}
5.查詢棧內元素 search(Object obj)
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
Stack類的方法就這5個,他的所有實現功能都是基於Vector類的方法。
三、基本使用Demo
@Test
public void test1() {
Stack<String> stack = new Stack<>();
stack.push("hello");
stack.push("world");
stack.push("java");
System.out.println("empty:" + stack.empty());
System.out.println("peek:" + stack.peek());
System.out.println("peek:" + stack.search("world"));
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}