java Vector 过时了_Vector和Stack(已过时,不建议使用)

以下内容基于jdk1.7.0_79源码;

什么是Vector和Stack

Vector:线程安全的动态数组

Stack:继承Vector,基于动态数组实现的一个线程安全的栈;

Vector和Stack特点

Vector与ArrayList基本是一致的,不同的是Vector是线程安全的,会在可能出现线程安全的方法前面加上synchronized关键字;

Vector:随机访问速度快,插入和移除性能较差(数组的特点);支持null元素;有顺序;元素可以重复;线程安全;

Stack:后进先出,实现了一些栈基本操作的方法(其实并不是只能后进先出,因为继承自Vector,可以有很多操作,从某种意义上来讲,不是一个栈);

Vector和Stack继承的类和实现的接口

6e9bc68efbd215a0e9f0300039ee4a79.png

以上接口和类中,关于Iterable接口、Collection接口、List接口、RandomAccess、 Cloneable、 java.io.Serializable接口、AbstractCollection类、AbstractList类的相关说明,可以参考上一篇:

Vector类

与ArrayList基本一致,可参考

1、Vector是线程安全的

2、ArrayList增长量默认是0.5倍;而Vector的增长量capacityIncrement是可以配置的,如果未指定(<=0),则大小增长一倍,源码如下:

private void grow(intminCapacity) {//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循环遍历;

packagecom.pichen.basis.col;importjava.util.Arrays;importjava.util.Iterator;importjava.util.List;importjava.util.ListIterator;importjava.util.Vector;public classTest {public static voidmain(String[] args) {

Vector vector = new Vector();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 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(newInteger[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 listIterator =vector.listIterator();

System.out.println(listIterator.hasPrevious());//listIterator(index)方法

ListIterator 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的几种遍历方式外,还有自己独有的遍历元素的方式(利用empty方法和pop方法实现栈顶到栈底的遍历):

packagecom.pichen.basis.col;importjava.util.Stack;public classTest {public static voidmain(String[] args) {

Stack stack = new Stack();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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值