- 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名称相同的方法,实现上没什么大的区别。
- Vector在java1.6和1.7
Vector在1.6和1.7基本没多少大的区别,首先在初始化上也基本相同。没有像ArrayList从1.6升到1.7,在调用构造方法的时候还有一点小的改动。
其次和ArrayList一样,Vector1.7将iterator()和listIterator()方法以及对应的内部类都有了自己的实现,不在采用父类中的方法。
- 含Element的方法
3.1 elements()
public Enumeration 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的实现基本一样。
- 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;
}
4.5 search
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
综上:stack中的方法也是特别的简单,无非也就是取了个有意义的方法名称而已,具体实现还是沿用了Vector中的方法。