1.Vector類(lèi)
API文檔的解釋?zhuān)?/p>
Vector類(lèi)可以實(shí)現(xiàn)可增長(zhǎng)的對(duì)象數(shù)組。與數(shù)組一樣,它包含可以使用整數(shù)索引進(jìn)行訪(fǎng)問(wèn)的組件。但是,Vector 的大小可以根據(jù)需要增大或縮小,以適應(yīng)創(chuàng)建 Vector 后進(jìn)行添加或移除項(xiàng)的操作。
java.util.vector提供了向量類(lèi)(vector)以實(shí)現(xiàn)類(lèi)似動(dòng)態(tài)數(shù)組的功能。在Java語(yǔ)言中沒(méi)有指針的概念,但如果正確靈活地使用指針又確實(shí)可以大大提高程序的質(zhì)量。比如在c,c++中所謂的“動(dòng)態(tài)數(shù)組”一般都由指針來(lái)實(shí)現(xiàn)。為了彌補(bǔ)這個(gè)缺點(diǎn),Java提供了豐富的類(lèi)庫(kù)來(lái)方便編程者使用,vector類(lèi)便是其中之一。事實(shí)上,靈活使用數(shù)組也可以完成向量類(lèi)的功能,但向量類(lèi)中提供大量的方法大大方便了用戶(hù)的使用。
創(chuàng)建了一個(gè)向量類(lèi)的對(duì)象后,可以往其中隨意插入不同類(lèi)的對(duì)象,即不需顧及類(lèi)型也不需預(yù)先選定向量的容量,并可以方便地進(jìn)行查找。對(duì)于預(yù)先不知或者不愿預(yù)先定義數(shù)組大小,并且需要頻繁地進(jìn)行查找,插入,刪除工作的情況??梢钥紤]使用向量類(lèi)。
Vector的源代碼與ArrayList非常相似,只不過(guò)在可能發(fā)生線(xiàn)程安全的方法上加上了Synchorized關(guān)鍵字,使得其執(zhí)行的效率相比ArrayList就低了。
Vector與ArrayList的比較:
(1)內(nèi)部都是數(shù)組結(jié)構(gòu)
Vector:
protected Object[] elementData;
ArrayList:
private transient Object[] elementData;
(2)線(xiàn)程安全
Vector類(lèi)支持線(xiàn)程的同步,即某一時(shí)刻只有一個(gè)線(xiàn)程能夠?qū)慥ector,避免多線(xiàn)程同時(shí)寫(xiě)而引起的不一致性,但實(shí)現(xiàn)同步需要很高的花費(fèi),因此,訪(fǎng)問(wèn)它比訪(fǎng)問(wèn)ArrayList慢。
以Vector類(lèi)中的isEmpty方法為例:
public synchronized boolean isEmpty() {
return elementCount == 0;
}
public boolean isEmpty() { //ArrayList類(lèi)
return size == 0;
}
(3)內(nèi)存不夠時(shí)擴(kuò)展的大小
ArrayList在內(nèi)存不夠時(shí)默認(rèn)是擴(kuò)展1.5倍
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
//oldCapacity>>1向右做位運(yùn)算,表示除以了2的1次方,及為原來(lái)的0.5倍。CPU直接支持位運(yùn)算,往往效率很高。
$news_page$
Vector在capacityIncrement大于0時(shí)擴(kuò)容capacityIncrement大小,否則為原始容量的2倍。如果使用構(gòu)造函數(shù)來(lái)new一個(gè)Vector時(shí),不指定capacityIncrement,則擴(kuò)容時(shí)擴(kuò)大為原來(lái)的2倍。
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
Vector的三種構(gòu)造函數(shù):
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
Vector的方法:
插入功能:
(1)public final synchronized void adddElement(Object obj)
將obj插入向量的尾部。obj可以是任何類(lèi)型的對(duì)象。對(duì)同一個(gè)向量對(duì)象,亦可以在其中插入不同類(lèi)的對(duì)象。但插入的應(yīng)是對(duì)象而不是數(shù)值,所以插入數(shù)值時(shí)要注意將數(shù)組轉(zhuǎn)換成相應(yīng)的對(duì)象。
例如:要插入整數(shù)1時(shí),不要直接調(diào)用v1.addElement(1),正確的方法為:
Vector v1 = new Vector();
Integer integer1 = new Integer(1);
v1.addElement(integer1);
(2)public final synchronized void setElementAt(Object obj,int index)
將index處的對(duì)象設(shè)置成obj,原來(lái)的對(duì)象將被覆蓋。
(3)public final synchronized void insertElement(Object obj,int index)
在index指定的位置插入obj,原來(lái)對(duì)象以及此后的對(duì)象依次往后順延。
$news_page$
刪除功能:
(1)public final synchronized void removeElement(Object obj)
從向量中刪除obj,若有多個(gè)存在,則從向量頭開(kāi)始試,刪除找到的第一個(gè)與obj相同的向量成員。
(2)public final synchronized void removeAllElement();
刪除向量所有的對(duì)象
(3)public fianl synchronized void removeElementAt(int index)
刪除index所指的地方的對(duì)象
查詢(xún)搜索功能:
(1)public final int indexOf(Object obj)
從向量頭開(kāi)始搜索obj,返回所遇到的第一個(gè)obj對(duì)應(yīng)的下標(biāo),若不存在此obj,返回-1.
(2)public final synchronized int indexOf(Object obj,int index)
從index所表示的下標(biāo)處開(kāi)始搜索obj.
(3)public final int lastindexOf(Object obj)
從向量尾部開(kāi)始逆向搜索obj.
(4)public final synchornized int lastIndex(Object obj,int index)
從index所表示的下標(biāo)處由尾至頭逆向搜索obj.
(5)public final synchornized firstElement()
獲取向量對(duì)象中的首個(gè)obj
(6)public final synchornized Object lastElement()
獲取向量對(duì)象的最后一個(gè)obj
2.Stack類(lèi)
Stack是棧,它通過(guò)五個(gè)操作對(duì)類(lèi)Vector 進(jìn)行了擴(kuò)展 ,允許將向量視為堆棧。它提供了通常的push 和 pop 操作,以及取堆棧頂點(diǎn)的peek 方法、測(cè)試堆棧是否為空的 empty 方法、在堆棧中查找項(xiàng)并確定到堆棧頂距離的search 方法。
它的特性是:先進(jìn)后出(FILO, First In Last Out)。Stack是繼承于Vector(矢量隊(duì)列)的,由于Vector是通過(guò)數(shù)組實(shí)現(xiàn)的,這就意味著,Stack也是通過(guò)數(shù)組實(shí)現(xiàn)的。其類(lèi)的源代碼如下:
public class Stack<e> extends Vector<e> {
public Stack() { }
public E push(E item) { // 壓棧
addElement(item);
return item;
}
public synchronized E pop() { // 彈棧
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
public synchronized E peek() { // 返回棧頂元素
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public boolean empty() { // 判斷棧是否為空
return size() == 0;
}
public synchronized int search(Object o) { // 查找元素
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
}
更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄