ArrayList,LinkedList,​Vector区别

ArrayList:其实现为数组方式实现,很多面试者都考了实现方式(笔者曾经被多次问及ArrayList实现方式),他内部实现其实是数组方式实现

继承机构如下

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

其中他实现了RandomAccess,用来标记其支持快速(通常是固定时间)随机访问。如果要是访问多的话即用ArrayList


private transient Object[] elementData; //说明其实现方式是数组


LinkedList:其实现方式为实现了Deque,而Deque又继承自Queue(队列)。所以他主要用来队列中使用,其删除速度较ArrayList要快许多。

继承机构如下

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

Vector:其主要是早起存在的list,他的继承方式和arrayList相同,同样是数组实现方式,只不过他的每个方法都被synchronized修饰,说明其类是线程安全的,而arrayList是非线程安全的,但是从java1.2开始就可以不需要用它了如果需要同步功能,只需要调用集合工具类Collections的synchronizedList(List<T> list)方法即可。

下面代码分析了LinkedList和ArrayList的读取效率,以及删除效率


import java.util.*;

/**
 * Created by StateGrace on 2014/10/21.
 */
public class ReadList {
    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList();
        long start  = System.currentTimeMillis();
        for (int i = 0 ;i<10000000;i++){
            arrayList.add(i);
        }
        System.out.println("插入元素所用时间为:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        arrayList.add(9999,9999);
        System.out.println("指定位置插入元素:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        Iterator it = arrayList.iterator();
        while(it.hasNext()){
            it.next();
        }
        System.out.println("迭代器所用时间为:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        for(Integer integer :arrayList){
            integer.toString();
        }
        System.out.println("foreach所用时间为:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        arrayList.get(999999);
        System.out.println("单个get所用时间:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        arrayList.remove(999999);
        arrayList.remove(11123);
        arrayList.remove(5475467);
        arrayList.remove(769);
        arrayList.remove(98089);
        arrayList.remove(234234);
        arrayList.remove(786768);
        arrayList.remove(25465);
        arrayList.remove(8956);
        arrayList.remove(124794);
        System.out.println("移除10个中间元素时间:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        for (int i = 0; i < arrayList.size(); i++) {
            arrayList.get(i);
        }
        System.out.println("for循环所用时间为:"+(System.currentTimeMillis()-start));

        System.out.println("===============分割线====================");

        List<Integer> linkedList = new LinkedList();
        start = System.currentTimeMillis();
        for (int i = 0 ;i < 10000000;i++){
            //linkedList.
            linkedList.add(i);
        }
        System.out.println("插入元素所用时间为:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        linkedList.add(9999,9999);
        System.out.println("指定位置插入元素:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        Iterator iteror = linkedList.iterator();
        while(iteror.hasNext()){
            iteror.next();
        }
        System.out.println("迭代器所用时间为:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        for(Integer integer :linkedList){
            integer.toString();
        }
        System.out.println("foreach所用时间为:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        linkedList.get(999999);
        System.out.println("单个get所用时间:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        linkedList.remove(999999);
        linkedList.remove(11123);
        linkedList.remove(5475467);
        linkedList.remove(769);
        linkedList.remove(98089);
        linkedList.remove(234234);
        linkedList.remove(786768);
        linkedList.remove(25465);
        linkedList.remove(8956);
        linkedList.remove(124794);
        System.out.println("移除10个中间元素时间:"+(System.currentTimeMillis()-start));
        start = System.currentTimeMillis();
        for (int i = 0; i < linkedList.size(); i++) {
            linkedList.get(i);
        }
        System.out.println("for循环所用时间为:"+(System.currentTimeMillis()-start));

        //这个是同步list的代码
        Collections.synchronizedList(linkedList);
    }
}


结果

插入元素所用时间为:868
指定位置插入元素:9
迭代器所用时间为:18
foreach所用时间为:1140
单个get所用时间:0
移除10个中间元素时间:88
for循环所用时间为:28
===============分割线====================
插入元素所用时间为:1897
指定位置插入元素:0
迭代器所用时间为:104
foreach所用时间为:1165
单个get所用时间:11
移除10个中间元素时间:51


其中,执行for循环linkedList会慢到假死,所以尽量要用 iterator()方法去遍历。

你可能感兴趣的:(ArrayList,LinkedList,​Vector区别)