歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java中的Vector和Stack

Java中的Vector和Stack

日期:2017/3/1 9:18:11   编辑:Linux編程

以下內容基於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;

Copyright © Linux教程網 All Rights Reserved