Java中LinkedList和ArrayList的區別

來源:互聯網
上載者:User

標籤:java   基礎   arraylist   linkedlist   

首先亮一下他們兩個基本區別,面試的時候可以用來和面試官嘮嗑啊
1、ArrayList實現了基本動態數組結構,Linked基於鏈表的結構。鏈表?什麼是鏈表?答:“鏈表是一種實體儲存體單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過鏈表中指標串連次序實現的”註:此句話通過了科普中國百科科學詞條編寫與應用工作項目的審核。
2、對於get和set,ArrayList的效能優於LinkedList,因為Linked要移動指標,麻煩的很
3、對於add和remove,LinkedList要優於ArrayList,因為鏈表就擅長這個,ArrayList還要移動資料
LinkedList和ArrayList是兩個集合類,用於儲存一系列的對象引用(references)。例如我們用ArrayList來儲存一系列String或者Integer。那麼ArrayList和LinkedList在效能上有什麼差別?
假如我們有一個很大的列表,裡面的元素已經排好序,我們對這個列進行二分尋找(binary search),比較兩種List的速度,源碼如下:

public class TestList {    public static final int N = 50000;    public static List<Integer> values;    static{        Integer vals[] = new Integer[N];        Random random = new Random();        for(int i=0,currval=0;i<N;i++){            vals[i] = new Integer(currval);            currval += random.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("error occoured ");            }        }        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的耗時:12
LinkedList的耗時:5346
很明顯,ArrayList的時間明顯小於LinkedList。二分法尋找使用的是隨機存取原則,而LinkedList是不支援快速隨機訪問的。
下面再看一個對List進行大量增加和刪除的例子:

public class ListDemo {    public 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(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的耗時:5
LinkedList的耗時:4
結果是出乎我的意料之外的,我把N分別設定為了5000、500000他們的耗時都非常接近,看來理論知識與現實情況還有有一定的差距。當我將N增到至500W的時候LinkedList的耗時竟然超過了ArrayList。希望看到我的文章的知道真相的大神們可以給我講解下,謝謝。

Java中LinkedList和ArrayList的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.