【JAVA集合】Vector和Stack,javavectorstack

來源:互聯網
上載者:User

【JAVA集合】Vector和Stack,javavectorstack

以下內容基於jdk1.7.0_79源碼;

什麼是Vector和Stack

Vector:安全執行緒的動態數組

Stack:繼承Vector,基於動態數組實現的一個安全執行緒的棧;

Vector和Stack特點

Vector與ArrayList基本是一致的,不同的是Vector是安全執行緒的,會在可能出現安全執行緒的方法前面加上synchronized關鍵字;

Vector:隨機訪問速度快,插入和移除效能較差(數組的特點);支援null元素;有順序;元素可以重複;安全執行緒;

Stack:後進先出,實現了一些棧基本操作的方法(其實並不是只能後進先出,因為繼承自Vector,可以有很多操作,從某種意義上來講,不是一個棧);

Vector和Stack繼承的類和實現的介面

以上介面和類中,關於Iterable介面、Collection介面、List介面、RandomAccess、 Cloneable、 java.io.Serializable介面、AbstractCollection類、AbstractList類的相關說明,可以參考上一篇:JAVA中的ArrayList,基本都是一樣的;剩下Vector類和Stack類如下:

Vector類

與ArrayList基本一致,可參考JAVA中的ArrayList,剩下的主要不同點如下:

1、Vector是安全執行緒的

2、ArrayList增長量預設是0.5倍;而Vector的增長量capacityIncrement是可以配置的,如果未指定(<=0),則大小增長一倍,源碼如下:

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

3、其它,如構造方法不一致,Vector可以通過構造方法初始化capacityIncrement,另外還有其它一些方法,如indexOf方法,Vector支援從指定位置開始搜尋尋找;另外,Vector還有一些功能重複的冗餘方法,如addElement,setElementAt方法,之所以這樣,是由於曆史原因,像addElement方法是以前遺留的,當集合架構引進的時候,Vector加入集合大家族,改成實現List介面,需要實現List介面中定義的一些方法,所以出現了一些功能冗餘的方法;

Stack類

實現了棧的基本操作。方法如下:

public Stack();

建立空棧

public synchronized E peek();

返回棧頂的值;

public E push(E item);

入棧操作;

public synchronized E pop();

出棧操作;

public boolean empty();

判斷棧是否為空白;

public synchronized int search(Object o);

返回對象在棧中的位置;

Vector和Stack使用舉例

Vector中的部分方法使用如下,另外Vector的遍曆方式跟ArrayList一致,可以用foreach,迭代器,for迴圈遍曆;

package com.pichen.basis.col;import java.util.Arrays;import java.util.Iterator;import java.util.List;import java.util.ListIterator;import java.util.Vector;public class Test {    public static void main(String[] args) {        Vector<Integer> vector = new Vector<Integer>();        for(int i = 0; i < 10; i++){            vector.add(i);        }                //直接列印        System.out.println(vector.toString());                //size()        System.out.println(vector.size());                //contains        System.out.println(vector.contains(2));                //iterator        Iterator<Integer> iterator = vector.iterator();        while(iterator.hasNext()){            System.out.print(iterator.next() + " ");        }                //toArray        Object[] objArr = vector.toArray();        System.out.println("\nobjArr:" + Arrays.asList(objArr));        Integer[] intArr = vector.toArray(new Integer[vector.size()]);        System.out.println("intArr:" + Arrays.asList(intArr));                //add        vector.add(5);                //remove        vector.remove(5);                System.out.println(vector);                //containsAll        System.out.println(vector.containsAll(Arrays.asList(5,6)));                //addAll        vector.addAll(Arrays.asList(555,666));        System.out.println(vector);                //removeAll        vector.removeAll(Arrays.asList(555,666));        System.out.println(vector);                        //addAll方法        vector.addAll(5, Arrays.asList(666,666, 6));        System.out.println(vector);                //get方法        System.out.println(vector.get(5));                //set方法        vector.set(5, 55);        System.out.println(vector.get(5));                //add方法        vector.add(0, 555);        System.out.println(vector);                //remove方法        vector.remove(0);        System.out.println(vector);                //indexof方法        System.out.println(vector.indexOf(6));                //lastIndexOf方法        System.out.println(vector.lastIndexOf(6));                //listIterator方法        ListIterator<Integer> listIterator = vector.listIterator();        System.out.println(listIterator.hasPrevious());                //listIterator(index)方法        ListIterator<Integer> iListIterator = vector.listIterator(5);        System.out.println(iListIterator.previous());                //subList方法        System.out.println(vector.subList(5, 7));                //clear        vector.clear();        System.out.println(vector);            }}

Stack中的部分方法使用如下,因為Stack繼承Vector,所以Vector可以用的方法,Stack同樣可以使用,以下列出一些Stack專屬的方法的例子,很簡單,就是棧的一些基本操作,另外stack除了Vector的幾種遍曆方式外,還有自己專屬的遍曆元素的方式:

package com.pichen.basis.col;import java.util.Stack;public class Test {    public static void main(String[] args) {        Stack<Integer> stack = new Stack<Integer>();        for(int i = 0; i < 10; i++){            stack.add(i);        }                System.out.println(stack);                System.out.println(stack.peek());                stack.push(555);                System.out.println(stack);                System.out.println(stack.pop());                System.out.println(stack);                System.out.println(stack.empty());                System.out.println(stack.search(6));                System.out.println("stack遍曆:");        while(!stack.empty()){            System.out.print(stack.pop() + " ");        }    }}
建議

Vector是安全執行緒的,但是效能較差,一般情況下使用ArrayList,除非特殊需求;

如果打算用Stack作為棧來使用的話,就老老實實嚴格按照棧的幾種操作來使用,否則就是去了使用stack的意義,還不如用Vector;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.