<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    Java中ArrayList和LinkedList區別

    一般大家都知道ArrayList和LinkedList的大致區別:
      1.ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。
      2.對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。
      3.對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
      ArrayList和LinkedList是兩個集合類,用于存儲一系列的對象引用(references)。例如我們可以用ArrayList來存儲一系列的String或者Integer。那么ArrayList和LinkedList在性能上有什么差別呢?什么時候應該用ArrayList什么時候又該用LinkedList呢?
      一.時間復雜度
      首先一點關鍵的是,ArrayList的內部實現是基于基礎的對象數組的,因此,它使用get方法訪問列表中的任意一個元素時(random access),它的速度要比LinkedList快。LinkedList中的get方法是按照順序從列表的一端開始檢查,直到另外一端。對LinkedList而言,訪問列表中的某個指定元素沒有更快的方法了。
      假設我們有一個很大的列表,它里面的元素已經排好序了,這個列表可能是ArrayList類型的也可能是LinkedList類型的,現在我們對這個列表來進行二分查找(binary search),比較列表是ArrayList和LinkedList時的查詢速度,看下面的程序:
    package testlist;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Random;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    public class TestList {
    public static final int N = 50000;
    public static List<Integer> values;
    static {
    Integer vals[] = new Integer[N];
    Random r = new Random();
    for (int i = 0, currval = 0; i < N; i++) {
    vals[i] = new Integer(currval);
    currval += r.nextInt(100) + 1;
    }
    values = Arrays.asList(vals);
    }
    static long timeList(List<Integer> lst) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < N; i++) {
    int index = Collections.binarySearch(lst, values.get(i));
    if (index != i)
    System.out.println("***錯誤***");
    }
    return System.currentTimeMillis() - start;
    }
    public static void main(String args[]) {
    System.out.println("ArrayList消耗時間:" + timeList(new ArrayList<Integer>(values)));
    System.out.println("LinkedList消耗時間:" + timeList(new LinkedList<Integer>(values)));
    }
    }
      我得到的輸出是:
      ArrayList消耗時間:31
      LinkedList消耗時間:30688
     這個結果不是固定的,但是基本上ArrayList的時間要明顯小于LinkedList的時間。因此在這種情況下不宜用LinkedList。二分查找法使用的隨機訪問(random access)策略,而LinkedList是不支持快速的隨機訪問的。對一個LinkedList做隨機訪問所消耗的時間與這個list的大小是成比例的。而相應的,在ArrayList中進行隨機訪問所消耗的時間是固定的。
      如果只是遍歷一下:
    packagetestlist;
    importjava.util.LinkedList;
    importjava.util.List;
    importjava.util.Random;
    importjava.util.ArrayList;
    importjava.util.Arrays;
    publicclassTestList{
    publicstaticfinalintN=50000;
    publicstaticList<Integer>values;
    static{
    Integervals[]=newInteger[N];
    Randomr=newRandom();
    for(inti=0,currval=0;i<N;i++){
    vals[i]=newInteger(currval);
    currval+=r.nextInt(100)+1;
    }
    values=Arrays.asList(vals);
    }
    staticlongtimeList(List<Integer>lst){
    longstart=System.currentTimeMillis();
    for(inti=0;i<lst.size();i++){
    lst.get(i);
    }
    returnSystem.currentTimeMillis()-start;
    }
    publicstaticvoidmain(Stringargs[]){
    System.out.println("ArrayList消耗時間:"+timeList(newArrayList<Integer>(values)));
    System.out.println("LinkedList消耗時間:"+timeList(newLinkedList<Integer>(values)));
    }
    }
      輸出:
      ArrayList消耗時間:0
      LinkedList消耗時間:1703
      這是否表明ArrayList總是比LinkedList性能要好呢?這并不一定,在某些情況下LinkedList的表現要優于ArrayList,有些算法在LinkedList中實現時效率更高。比方說,利用Collections.reverse方法對列表進行反轉時,其性能就要好些。
      看這樣一個例子,加入我們有一個列表,要對其進行大量的插入和刪除操作,在這種情況下LinkedList就是一個較好的選擇。請看如下一個極端的例子,我們重復的在一個列表的開端插入一個元素:
    package testlist;
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    public class ListDemo {
    static final int N = 50000;
    static long timeList(List<Object> list) {
    long start = System.currentTimeMillis();
    Object o = new Object();
    for (int i = 0; i < N; i++)
    list.add(0, o);
    return System.currentTimeMillis() - start;
    }
    public static void main(String[] args) {
    System.out.println("ArrayList耗時:" + timeList(new ArrayList<Object>()));
    System.out.println("LinkedList耗時:" + timeList(new LinkedList<Object>()));
    }
    }
      這時我的輸出結果是:
      ArrayList耗時:1813
      LinkedList耗時:0
      這和前面一個例子的結果截然相反,當一個元素被加到ArrayList的最開端時,所有已經存在的元素都會后移,這就意味著數據移動和復制上的開銷。相反的,將一個元素加到LinkedList的最開端只是簡單的未這個元素分配一個記錄,然后調整兩個連接。在LinkedList的開端增加一個元素的開銷是固定的,而在ArrayList的開端增加一個元素的開銷是與ArrayList的大小成比例的。

      二.空間復雜度
      在LinkedList中有一個私有的內部類,定義如下:
    private static class Entry<E> {
    E element;
    Entry<E> next;
    Entry<E> previous;
    Entry(E element, Entry<E> next, Entry<E> previous) {
    this.element = element;
    this.next = next;
    this.previous = previous;
    }
    }
      每個Entry對象reference列表中的一個元素,同時還有在LinkedList中它的上一個元素和下一個元素。一個有1000個元素的LinkedList對象將有1000個鏈接在一起的Entry對象,每個對象都對應于列表中的一個元素。這樣的話,在一個LinkedList結構中將有一個很大的空間開銷,因為它要存儲這1000個Entity對象的相關信息。
      ArrayList使用一個內置的數組來存儲元素,這個數組的起始容量是10.當數組需要增長時,新的容量按如下公式獲得:新容量=(舊容量*3)/2+1,也就是說每一次容量大概會增長50%。這就意味著,如果你有一個包含大量元素的ArrayList對象,那么最終將有很大的空間會被浪費掉,這個浪費是由ArrayList的工作方式本身造成的。如果沒有足夠的空間來存放新的元素,數組將不得不被重新進行分配以便能夠增加新的元素。對數組進行重新分配,將會導致性能急劇下降。如果我們知道一個ArrayList將會有多少個元素,我們可以通過構造方法來指定容量。我們還可以通過trimToSize方法在ArrayList分配完畢之后去掉浪費掉的空間。
      三.總結
      ArrayList和LinkedList在性能上各有優缺點,都有各自所適用的地方,總的說來可以描述如下:
      1.對ArrayList和LinkedList而言,在列表末尾增加一個元素所花的開銷都是固定的。對ArrayList而言,主要是在內部數組中增加一項,指向所添加的元素,偶爾可能會導致對數組重新進行分配;而對LinkedList而言,這個開銷是統一的,分配一個內部Entry對象。
      2.在ArrayList的中間插入或刪除一個元素意味著這個列表中剩余的元素都會被移動;而在LinkedList的中間插入或刪除一個元素的開銷是固定的。
      3.LinkedList不支持高效的隨機元素訪問。
      4.ArrayList的空間浪費主要體現在在list列表的結尾預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗相當的空間
      可以這樣說:當操作是在一列數據的后面添加數據而不是在前面或中間,并且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能;當你的操作是在一列數據的前面或中間添加或刪除數據,并且按照順序訪問其中的元素時,就應該使用LinkedList了。

    posted on 2014-01-08 10:41 順其自然EVO 閱讀(199) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2014年1月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲自偷自偷精品| 午夜免费福利网站| 免费无码国产V片在线观看| 久久精品国产亚洲一区二区| 性色av无码免费一区二区三区| 香蕉免费看一区二区三区| 77777亚洲午夜久久多喷| 亚洲av女电影网| 色久悠悠婷婷综合在线亚洲| 免费毛片在线视频| 女人与禽交视频免费看| 8090在线观看免费观看| 久久免费国产视频| 久久精品视频免费播放| 最近国语视频在线观看免费播放 | a毛片免费在线观看| 中文字幕在线观看免费| 精品久久久久久国产免费了| 久久亚洲精品成人无码| 青青青亚洲精品国产| 国产午夜亚洲精品不卡| 亚洲AV综合永久无码精品天堂| 亚洲国产成人精品无码区二本| 亚洲AV无码一区二区大桥未久| 亚洲最大无码中文字幕| 爱爱帝国亚洲一区二区三区| 日韩电影免费在线观看网址| 黄色网页在线免费观看| a级毛片免费全部播放无码| 久久久久久AV无码免费网站 | 色屁屁www影院免费观看视频| 污污污视频在线免费观看| 国产精品免费观看调教网| 亚欧免费视频一区二区三区| 免费无遮挡无码永久在线观看视频| 国产乱子影视频上线免费观看| 亚洲一级特黄大片无码毛片| 亚洲精品在线免费观看视频| 亚洲aⅴ无码专区在线观看| 免费萌白酱国产一区二区三区| 国产2021精品视频免费播放|