Vector、Stack、ArrayList、LinkList的关系

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 方法,以减少增量重新分配的次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值