Java中各種線性表的效能分析

quentain發表於2015-09-16

        LinkedList與ArrayList、ArrayDeque的實現機制完全不同,ArrayList、ArrayDeque內部以陣列的形式來儲存集合中的元素,因此隨機訪問集合元素時有較好的效能;而LinkedList內部以連結串列的形式來儲存集合中的元素,因此隨機訪問集合元素時效能較差;但在插入、刪除元素時效能比較出色(只需要改變指標所指的地址即可)。需要指出的是,雖然Vector也是以陣列的形式來儲存集合元素的,但因為它實現了執行緒同步功能(而且實現機制也不好),所以各方面效能都比較差。

       對於所有的內部基於陣列的集合實現,例如ArrayList、ArrayDeque等,使用隨機訪問的效能比使用Iterator迭代訪問的效能要好,因為隨機訪問會被對映成對陣列元素的訪問。

        Java提供的List就是一個線性表介面,而ArrayList、LinkedList又是線性表的兩種典型的實現;基於陣列的線性表和基於鏈的線性表。Queue代表了佇列,Deque代表了雙端佇列(既可作為佇列使用,也可以作為棧使用),接下來對各種實現類的效能進行分析。

        初學者可以無須理會ArrayList和LinkedList之間的效能差異,只需要知道LinkedList集合不僅提供了List的功能,還提供了雙端佇列、棧的功能就行。但對於一個成熟的Java程式設計師,在一些效能非常敏感的地方,可能需要慎重選擇哪個List實現。

         一般來說,由於陣列以一塊連續記憶體區來儲存所有的陣列元素,所以陣列在隨機訪問時效能最好,所有的內部以陣列作為底層實現的集合在隨機訪問時效能都比較好;而內部以連結串列作為底層實現的集合在執行插入、刪除操作時有較好的效能。但總體來說,ArrayList的效能比LinkedList的效能要好,因此大部分時候都應該考慮使用ArrayList

         關於使用List集合有如下建議。

          如果需要遍歷List集合元素,對於ArrayList、Vector集合,應該使用隨機訪問方法(get)來遍歷集合元素,這樣效能更好;對於LinkedList集合,則應該採用迭代器(Iterator)來遍歷集合元素。

          如果需要經常執行插入、刪除操作來改變包含大量資料的List集合的大小,可考慮使用LinedList集合。使用ArrayList、Vector集合可能需要經常重新分配內部陣列的大小,效果可能較差。

          如果有多個執行緒需要同時訪問List集合中的元素,開發者可考慮使用Collections將集合包裝成執行緒安全的集合。


          

相關文章