Java中Vector類和Stack類的學(xué)習(xí)
來源:易賢網(wǎng) 閱讀:875 次 日期:2015-04-10 16:07:12
溫馨提示:易賢網(wǎng)小編為您整理了“Java中Vector類和Stack類的學(xué)習(xí)”,方便廣大網(wǎng)友查閱!

1.Vector類

API文檔的解釋:

Vector類可以實(shí)現(xiàn)可增長的對(duì)象數(shù)組。與數(shù)組一樣,它包含可以使用整數(shù)索引進(jìn)行訪問的組件。但是,Vector 的大小可以根據(jù)需要增大或縮小,以適應(yīng)創(chuàng)建 Vector 后進(jìn)行添加或移除項(xiàng)的操作。

java.util.vector提供了向量類(vector)以實(shí)現(xiàn)類似動(dòng)態(tài)數(shù)組的功能。在Java語言中沒有指針的概念,但如果正確靈活地使用指針又確實(shí)可以大大提高程序的質(zhì)量。比如在c,c++中所謂的“動(dòng)態(tài)數(shù)組”一般都由指針來實(shí)現(xiàn)。為了彌補(bǔ)這個(gè)缺點(diǎn),Java提供了豐富的類庫來方便編程者使用,vector類便是其中之一。事實(shí)上,靈活使用數(shù)組也可以完成向量類的功能,但向量類中提供大量的方法大大方便了用戶的使用。

創(chuàng)建了一個(gè)向量類的對(duì)象后,可以往其中隨意插入不同類的對(duì)象,即不需顧及類型也不需預(yù)先選定向量的容量,并可以方便地進(jìn)行查找。對(duì)于預(yù)先不知或者不愿預(yù)先定義數(shù)組大小,并且需要頻繁地進(jìn)行查找,插入,刪除工作的情況??梢钥紤]使用向量類。

Vector的源代碼與ArrayList非常相似,只不過在可能發(fā)生線程安全的方法上加上了Synchorized關(guān)鍵字,使得其執(zhí)行的效率相比ArrayList就低了。

Vector與ArrayList的比較:

(1)內(nèi)部都是數(shù)組結(jié)構(gòu)

Vector:

protected Object[] elementData;

ArrayList:

private transient Object[] elementData;

(2)線程安全

Vector類支持線程的同步,即某一時(shí)刻只有一個(gè)線程能夠?qū)慥ector,避免多線程同時(shí)寫而引起的不一致性,但實(shí)現(xiàn)同步需要很高的花費(fèi),因此,訪問它比訪問ArrayList慢。

以Vector類中的isEmpty方法為例:

public synchronized boolean isEmpty() {

return elementCount == 0;

}

public boolean isEmpty() { //ArrayList類

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次方,及為原來的0.5倍。CPU直接支持位運(yùn)算,往往效率很高。

$news_page$

Vector在capacityIncrement大于0時(shí)擴(kuò)容capacityIncrement大小,否則為原始容量的2倍。如果使用構(gòu)造函數(shù)來new一個(gè)Vector時(shí),不指定capacityIncrement,則擴(kuò)容時(shí)擴(kuò)大為原來的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可以是任何類型的對(duì)象。對(duì)同一個(gè)向量對(duì)象,亦可以在其中插入不同類的對(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,原來的對(duì)象將被覆蓋。

(3)public final synchronized void insertElement(Object obj,int index)

在index指定的位置插入obj,原來對(duì)象以及此后的對(duì)象依次往后順延。

$news_page$

刪除功能:

(1)public final synchronized void removeElement(Object obj)

從向量中刪除obj,若有多個(gè)存在,則從向量頭開始試,刪除找到的第一個(gè)與obj相同的向量成員。

(2)public final synchronized void removeAllElement();

刪除向量所有的對(duì)象

(3)public fianl synchronized void removeElementAt(int index)

刪除index所指的地方的對(duì)象

查詢搜索功能:

(1)public final int indexOf(Object obj)

從向量頭開始搜索obj,返回所遇到的第一個(gè)obj對(duì)應(yīng)的下標(biāo),若不存在此obj,返回-1.

(2)public final synchronized int indexOf(Object obj,int index)

從index所表示的下標(biāo)處開始搜索obj.

(3)public final int lastindexOf(Object obj)

從向量尾部開始逆向搜索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類

Stack是棧,它通過五個(gè)操作對(duì)類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是通過數(shù)組實(shí)現(xiàn)的,這就意味著,Stack也是通過數(shù)組實(shí)現(xiàn)的。其類的源代碼如下:

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ù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:Java中Vector類和Stack類的學(xué)習(xí)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)