Vector和Stack的关系:
它通过五个操作对类Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的push 和 pop 操作,以及取堆栈顶点的peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的search 方法。
public class Stack<e> extends Vector<e> {
public Stack() { }
public E push(E item) { // 压栈
addElement(item);
return item;
}
public synchronized E pop() { // 弹栈
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
public synchronized E peek() { // 返回栈顶元素
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public boolean empty() { // 判断栈是否为空
return size() == 0;
}
public synchronized int search(Object o) { // 查找元素
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
}
Vector和ArrayList的关系:
Vector和ArrayList源码非常相似,区别:在可能发生线程安全的方法上加上了synchronized字段,因此vector的查询效率低于ArrayList;
总结:
二者的内部结构、基本方法大致相同.只不过Vector(多synchronized同步字段)是线程安全的,ArrayList是不安全的。
ArrayList和Vector相比于一般的Array,就是多了一个变长的功能,但相应的时间效率有所下降。
ArrayList和LinkList的关系:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ensureCapacity方法
ArrayList 源码中有一个 ensureCapacity 方法不知道大家注意到没有,这个方法 ArrayList 内部没有被调用过,所以很显然是提供给用户调用的,那么这个方法有什么作用呢?
/**
如有必要,增加此 ArrayList 实例的容量,以确保它至少可以容纳由minimum capacity参数指定的元素数。
*
-
@param minCapacity 所需的最小容量
*/
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It’s already
// supposed to be at default size.
: DEFAULT_CAPACITY;if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
最好在 add 大量元素之前用 ensureCapacity 方法,以减少增量重新分配的次数,我们通过下面的代码实际测试以下这个方法的效果:
复制代码
public class EnsureCapacityTest {
public static void main(String[] args) {
ArrayList list = new ArrayList();
final int N = 10000000;
long startTime = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
list.add(i);
}
long endTime = System.currentTimeMillis();
System.out.println(“使用ensureCapacity方法前:”+(endTime - startTime));
}
}
运行结果:
使用ensureCapacity方法前:2158
复制代码
public class EnsureCapacityTest {
public static void main(String[] args) {
ArrayList list = new ArrayList();
final int N = 10000000;
list = new ArrayList();
long startTime1 = System.currentTimeMillis();
list.ensureCapacity(N);
for (int i = 0; i < N; i++) {
list.add(i);
}
long endTime1 = System.currentTimeMillis();
System.out.println(“使用ensureCapacity方法后:”+(endTime1 - startTime1));
}
}
运行结果:
使用ensureCapacity方法后:1773
通过运行结果,我们可以看出向 ArrayList 添加大量元素之前最好先使用ensureCapacity 方法,以减少增量重新分配的次数。