比较ArrayList、LinkedList、Vector

ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.
LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面非常弱于ArrayList.

Vector 和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.
LinkedList 还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.
注意: 默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销

以下是测试代码:

public static void main(String[] args) {
         List<Integer> list1 = new ArrayList<Integer>();
         List<Integer> list2 = new LinkedList<Integer>();
         int num = 100 * 1000;
         long time = new Date().getTime();
        for(int i=0;i<num;i++){
            list1.add(i);
        }
        System.out.println("ArrayList add:" + (new Date().getTime() - time));time = new Date().getTime();
        for(int i=0;i<num;i++){
            list2.add(i);
        }
        System.out.println("LinkedList add:" + (new Date().getTime() - time));time = new Date().getTime();
        System.out.println("--------------------");
        for(int i=0;i<num;i++){
            list1.get(i);
        }
        System.out.println("ArrayList get:" + (new Date().getTime() - time));time = new Date().getTime();
        for(int i=0;i<num;i++){
            list2.get(i);
        }
        System.out.println("LinkedList get:" + (new Date().getTime() - time));time = new Date().getTime();
        System.out.println("--------------------");
        for(int i=0;i<num;i++){
            list1.set(i,i);
        }
        System.out.println("ArrayList set:" + (new Date().getTime() - time));time = new Date().getTime();
        for(int i=0;i<num;i++){
            list2.set(i,i);
        }
        System.out.println("LinkedList set:" + (new Date().getTime() - time));time = new Date().getTime();
        System.out.println("--------------------");
        
        for(int i=0;i<num;i++){
            list1.remove(0);
        }
        System.out.println("ArrayList remove:" + (new Date().getTime() - time));time = new Date().getTime();
        for(int i=0;i<num;i++){
            list2.remove(0);
        }
        System.out.println("LinkedList remove:" + (new Date().getTime() - time));time = new Date().getTime();
        System.out.println("--------------------");
    }

运行结果:

ArrayList add:10
LinkedList add:0
--------------------
ArrayList get:10
LinkedList get:9878
--------------------
ArrayList set:0
LinkedList set:9829
--------------------
ArrayList remove:4121
LinkedList remove:0
--------------------

从以上代码的运行结果看,在开发过程中使用ArrayList还是LinkedList 是按实际情况去运用的;

 

posted @ 2014-08-07 11:04  yanbl  阅读(82)  评论(0)    收藏  举报