Vector和Stack分析

来源:互联网 发布:js中array的indexof 编辑:程序博客网 时间:2024/06/08 21:27

1. Vector与ArrayList

作为底层都是采用动态数组作为实现基础的类,Vector和ArrayList在很多方面都是大同小异的。在阅读之前本文之前可以先阅读ArrayList的源码解析,然后Vector基本就一目了然了。
说下他们的主要区别:
1. Vector里面的方法都是同步的,线程安全的。
2. Vector的扩容大小与ArrayList不同,Vector1.6和1.7中都是上一次大小的2倍。
3. Vector多了许多包含Element的方法 (Vector的子类栈Stack实际采用的是这些方法)
其次Vector比ArrayList还多了一个成员变量 capacityIncrement, 可以通过构造方法指定

// 自定义的扩容增长大小, 可以通过构造方法指定大小protected int capacityIncrement; // 在扩容的时候会使用到// 1.6int newCapacity = (capacityIncrement > 0) ?                 (oldCapacity + capacityIncrement) : (oldCapacity * 2);// 1.7int newCapacity = oldCapacity +                  ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);

然后如果不指定数据数组的大小,那么就和ArrayList一样,Vector的默认大小也是10。其余与ArrayList名称相同的方法,实现上没什么大的区别。

2. Vector在java1.6和1.7

Vector在1.6和1.7基本没多少大的区别,首先在初始化上也基本相同。没有像ArrayList从1.6升到1.7,在调用构造方法的时候还有一点小的改动。
其次和ArrayList一样,Vector1.7将iterator()和listIterator()方法以及对应的内部类都有了自己的实现,不在采用父类中的方法。

3. 含Element的方法

3.1 elements()

public Enumeration<E> elements() {...}

这个方法返回 Enumeration 接口的实现,与 iterator() 返回的 Iterator 接口实现基本一样,Enumeration 接口貌似由于方法名称太长和功能与Iterator 接口重复原因,后来建议使用Iterator 接口。。。

3.2 firstElement()和lastElement()

public synchronized E firstElement() {...}public synchronized E lastElement() {...}

顾名思义,返回第一个元素和最后一个元素,如果元素不存,则抛出 NoSuchElementException 异常

3.3 crud操作

// 获取指定索引的元素public synchronized E elementAt(int index) {}// 设置某个索引的元素public synchronized void setElementAt(E obj, int index) {}// 新增一个元素public synchronized void addElement(E obj) {}// 删除元素public synchronized void removeElementAt(int index) {}public synchronized boolean removeElement(Object obj) {}public synchronized void removeAllElements() {}// 在某个索引前插入某个元素public synchronized void insertElementAt(E obj, int index) {}

闻其名而知其意,内部实现与传统的add,get,remove的实现基本一样。

4. Stack

栈是数据结构中一种很重要的数据结构类型。java提供了其实现Stack。
首先,Stack在java1.6和1.7源码一模一样。。
Stack是Vector的子类,大部分的方法都继承于Vector,且自己类中的方法也是同步的。
Stack中主要方法如下:

4.1 push

往栈中插入一个元素

public E push(E item) {    addElement(item);    return item;}

4.2 pop

从栈中弹出一个元素(删除返回),实际从Vector中数组末尾删除并返回

public synchronized E pop() {    E obj;    int len = size();    obj = peek();    removeElementAt(len - 1);    return obj;}

4.3 peek

获取栈顶的元素,但不删除。

public synchronized E peek() {    int len = size();    if (len == 0)        throw new EmptyStackException();    return elementAt(len - 1);}

4.4 empty

判断栈是否为空,感觉还不如用isEmpty()

public boolean empty() {    return size() == 0;}
public synchronized int search(Object o) {    int i = lastIndexOf(o);    if (i >= 0) {        return size() - i;    }    return -1;}

综上:stack中的方法也是特别的简单,无非也就是取了个有意义的方法名称而已,具体实现还是沿用了Vector中的方法。

0 0
原创粉丝点击