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

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;

Vector和Stack(已过时,不建议使用)的更多相关文章

  1. Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理

    本文非常详尽地介绍了Java中的三个集合类 ArrayList,Vector与Stack <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整 ...

  2. Vector和Stack源码分析/List集合的总结

    序言 这篇文章算是在这list接口下的集合的最后一篇了,前面ArrayList.LinkedList都已经讲解完了,剩下就Vector和Vector的子类Stack啦.继续努力.一步一个脚印, --W ...

  3. Android Studio编译OsmAnd出现警告:GeoPointParserUtil.java使用或覆盖了已过时的 API。有关详细信息请使用-Xlint:deprecation重新编译

    [背景] 之前折腾: [记录]Android Studio中导入OsmAnd并编译 期间,遇到了编译警告: 1 2 3 4 5 :OsmAnd-java:compileJava 注: E:\crifa ...

  4. Java集合 之List(ArrayList、LinkedList、Vector、Stack)理解(new)

    一. ArrayList底层实现原理 对比 和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOn ...

  5. Java ArrayList Vector LinkedList Stack Hashtable等的差别与用法(转)

    ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都容许直接序号索引元素,然则插入数据要设计到数组元素移动等内存操纵,所以索引数据快插入数 ...

  6. JDK的弃儿:Vector、Stack、Hashtable、Enumeration

    随着JDK的发展,一些设计缺陷或者性能不足的类库难免会被淘汰,最常见的就是Vector.Stack.HashTable和Enumeration了. Vector(@since 1.0) 首先看看Vec ...

  7. .NET 5+ 中已过时的功能

    从 .NET 5 开始,一些新标记为已过时的 API 使用 ObsoleteAttribute 上的两个新属性. ObsoleteAttribute.DiagnosticId 属性指示编译器使用自定义 ...

  8. 分配给 主机的 Evaluation Mode 许可证已过期。建议升级许可证。

    参考文献 http://247its.wordpress.com/2012/04/02/new-build-esxi-5-complaints-licence-has-expired/ http:// ...

  9. 解决Maven项目编译时提示:源值1.5已过时,将在未来所有版本中删除

    每次编译项目时,都提示:源值1.5已过时,将在未来所有版本中删除 查了一些资料,发现是因为IDEA默认把项目的源代码版本设置为jdk1.5,目标代码设置为jdk1.5 解决方案:  修改Maven的S ...

随机推荐

  1. jquery时间轴幻灯展示源代码

    查看效果:http://hovertree.com/texiao/jquery/75/ 源代码下载:http://hovertree.com/h/bjaf/8jlpc2wu.htm 效果图如下: 代码 ...

  2. 电脑Windows使用中遇到的那些问题

    Win64位注册表导入方法 64位Windows操作系统注册表不同于32位Windows操作系统,Win64 位版本分为 32 位注册表项和 64 位注册表项.默认 64 位版本注册表编辑器 (Reg ...

  3. Android Volley框架的使用(5)

    6. 设置超时时间 可以为请求设置超时时间.最大重试次数.重试时间增长因子等.其中new DefaultRetryPolicy()的第一个参数是超时时间,第二个参数是最大重试次数.第三个参数是重试时间 ...

  4. 口袋微博android源码服务端和客户端

    刚刚在源码天堂看到了一个不错的安卓SNS应用源码,而且也比较完整的,它基本具备了新浪微博的所有功能,包括查看最新的微博.微博评论.好友资料.回复评论以及发私信等,除此之外,还提供了许多独有的特色功能: ...

  5. Struts2之Struts2-2.5.5 Interceptor

    Struts2-2.5.5版本是目前为止最新的版本了,相对于之前的2.3版本以及再之前的版本而言,新版本改动了很多. 好了,废话不多说,GO CODE! 基本jar包: web.xml核心配置,这里要 ...

  6. Java--Spring AOP 源码散点记录(最后整理成一篇博客)

    Spring AOP 源码记录: 1.AOP 入口ProxyFactoryBean.getObject()方法: 2.AOP实现: (1)实现InvocationHandler接口 (2)通过java ...

  7. Yii2.0学习笔记:创建登录表单

    第一步:在model层创建一个EntryForm.php文件 复制以下代码,注意model的文件.方法.类的命名规范(大小写) <?php namespace app\models; use Y ...

  8. 解析XML

    1.解析String类型的XML字符串得到属性值 String  resultXML = "<?xml version="1.0" encoding="U ...

  9. mybatis 3的TypeHandler解析(null值的处理)

    最近,在测试迁移公司的交易客户端连接到自主研发的中间件时,调用DAO层时,发现有些参数并没有传递,而在mapper里面是通过parameterMap传递的,因为有些参数为null,这就导致了参数传递到 ...

  10. windows 7/10下安装oracle 10g

    有段时间没搞oracle了,最近要给别人在win 7下装个oracle 10g,特记录备忘下. 使用http://download.oracle.com/otn/nt/oracle10g/10201/ ...