Vector和Stack分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013082133/article/details/50430936

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.6
int newCapacity = (capacityIncrement > 0) ?
                 (oldCapacity + capacityIncrement) : (oldCapacity * 2);
// 1.7
int 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中的方法。

展开阅读全文

没有更多推荐了,返回首页