Java中Vector類和Stack類的學習

1.Vector類

API文檔的解釋:

    Vector類可以實現可增長的對象數組。與數組一樣,它包含可以使用整數索引進行訪問的組件。但是,Vector 的大小可以根據需要增大或縮小,以適應創建 Vector 後進行添加或移除項的操作。


        java.util.vector提供了向量類(vector)以實現類似動態數組的功能。在Java語言中沒有指針的概念,但如果正確靈活地使用指針又確實可以大大提高程序的質量。比如在c,c++中所謂的“動態數組”一般都由指針來實現。爲了彌補這個缺點,Java提供了豐富的類庫來方便編程者使用,vector類便是其中之一。事實上,靈活使用數組也可以完成向量類的功能,但向量類中提供大量的方法大大方便了用戶的使用。 
        創建了一個向量類的對象後,可以往其中隨意插入不同類的對象,即不需顧及類型也不需預先選定向量的容量,並可以方便地進行查找。對於預先不知或者不願預先定義數組大小,並且需要頻繁地進行查找,插入,刪除工作的情況。可以考慮使用向量類。 

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

Vector和ArrayList。二者的內部結構、基本方法大致相同.只不過Vector是線程安全的,ArrayList是不安全的。ArrayList相比於一般的Array,就是多了一個變長的功能,但相應的時間效率有所下降。


Vector與ArrayList的比較:

(1)內部都是數組結構

Vector:

protected Object[] elementData;
ArrayList:

private transient Object[] elementData;

(2)線程安全

Vector類支持線程的同步,即某一時刻只有一個線程能夠寫Vector,避免多線程同時寫而引起的不一致性,但實現同步需要很高的花費,因此,訪問它比訪問ArrayList慢。

以Vector類中的isEmpty方法爲例:

   public synchronized boolean isEmpty() {
        return elementCount == 0;
    }

  public boolean isEmpty() {   //ArrayList類
        return size == 0;
    }

(3)內存不夠時擴展的大小

ArrayList在內存不夠時默認是擴展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向右做位運算,表示除以了2的1次方,及爲原來的0.5倍。CPU直接支持位運算,往往效率很高。

Vector在capacityIncrement大於0時擴容capacityIncrement大小,否則爲原始容量的2倍。如果使用構造函數來new一個Vector時,不指定capacityIncrement,則擴容時擴大爲原來的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的三種構造函數:

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可以是任何類型的對象。對同一個向量對象,亦可以在其中插入不同類的對象。但插入的應是對象而不是數值,所以插入數值時要注意將數組轉換成相應的對象。 
例如:要插入整數1時,不要直接調用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處的對象設置成obj,原來的對象將被覆蓋。 
(3)public final synchronized void insertElement(Object obj,int index) 
在index指定的位置插入obj,原來對象以及此後的對象依次往後順延。 

刪除功能: 
(1)public final synchronized void removeElement(Object obj) 
從向量中刪除obj,若有多個存在,則從向量頭開始試,刪除找到的第一個與obj相同的向量成員。 
(2)public final synchronized void removeAllElement(); 
刪除向量所有的對象 
(3)public fianl synchronized void removeElementAt(int index) 
刪除index所指的地方的對象
 


查詢搜索功能: 
(1)public final int indexOf(Object obj) 
從向量頭開始搜索obj,返回所遇到的第一個obj對應的下標,若不存在此obj,返回-1. 
(2)public final synchronized int indexOf(Object obj,int index) 
從index所表示的下標處開始搜索obj. 
(3)public final int lastindexOf(Object obj) 
從向量尾部開始逆向搜索obj. 
(4)public final synchornized int lastIndex(Object obj,int index) 
從index所表示的下標處由尾至頭逆向搜索obj. 
(5)public final synchornized firstElement() 
獲取向量對象中的首個obj 
(6)public final synchornized Object lastElement() 
獲取向量對象的最後一個obj 




2.Stack類

Stack是棧,它通過五個操作對類Vector 進行了擴展 ,允許將向量視爲堆棧。它提供了通常的pushpop 操作,以及取堆棧頂點的peek 方法、測試堆棧是否爲空的 empty 方法、在堆棧中查找項並確定到堆棧頂距離的search 方法。 

它的特性是:先進後出(FILO, First In Last Out)。Stack是繼承於Vector(矢量隊列)的,由於Vector是通過數組實現的,這就意味着,Stack也是通過數組實現的。其類的源代碼如下:

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;
    }
 
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章