【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解(ArrayList、 LinkedList 和 Vector之间的区别)
ArrayList、 LinkedList 和 Vector之間的區別
ArrayList、 LinkedList 和 Vector都實現了List接口,是List的三種實現,所以在用法上非常相似。他們之間的主要區別體現在不同操作的性能上。后面會詳細分析。
ArrayList
ArrayList底層是用數組實現的,可以認為ArrayList是一個可改變大小的數組。隨著越來越多的元素被添加到ArrayList中,其規模是動態增加的。
LinkedList
LinkedList底層是通過雙向鏈表實現的。所以,LinkedList和ArrayList之前的區別主要就是數組和鏈表的區別。
數組中查詢和賦值比較快,因為可以直接通過數組下標訪問指定位置。
鏈表中刪除和增加比較快,因為可以直接通過修改鏈表的指針(Java中并無指針,這里可以簡單理解為指針。其實是通過Node節點中的變量指定)進行元素的增刪。
所以,LinkedList和ArrayList相比,增刪的速度較快。但是查詢和修改值的速度較慢。同時,LinkedList還實現了Queue接口,所以他還提供了offer(), peek(), poll()等方法。
Vector
Vector和ArrayList一樣,都是通過數組實現的,但是Vector是線程安全的。和ArrayList相比,其中的很多方法都通過同步(synchronized)處理來保證線程安全。
如果你的程序不涉及到線程安全問題,那么使用ArrayList是更好的選擇(因為Vector使用synchronized,必然會影響效率)。
二者之間還有一個區別,就是擴容策略不一樣。在List被第一次創建的時候,會有一個初始大小,隨著不斷向List中增加元素,當List認為容量不夠的時候就會進行擴容。Vector缺省情況下自動增長原來一倍的數組長度,ArrayList增長原來的50%。
效率對比試驗
package Action;import java.util.ArrayList; import java.util.LinkedList;public class test {public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<Integer>();LinkedList<Integer> linkedList = new LinkedList<Integer>();// ArrayList addlong startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {arrayList.add(i);}long endTime = System.nanoTime();long duration = endTime - startTime;System.out.println("ArrayList add: " + duration);System.gc();// LinkedList addstartTime = System.nanoTime();for (int i = 0; i < 100000; i++) {linkedList.add(i);}endTime = System.nanoTime();long duration1 = endTime - startTime;System.out.println("LinkedList add: " + duration1);System.out.println((duration<duration1?"ArrayList add":"LinkedList add")+"更快");System.out.println("--------------------------");System.gc();// ArrayList getstartTime = System.nanoTime();for (int i = 0; i < 10000; i++) {arrayList.get(i);}endTime = System.nanoTime();long duration2 = endTime - startTime;System.out.println("ArrayList get: " + duration2);System.gc();// LinkedList getstartTime = System.nanoTime();for (int i = 0; i < 10000; i++) {linkedList.get(i);}endTime = System.nanoTime();long duration3 = endTime - startTime;System.out.println("LinkedList get: " + duration3);System.out.println((duration2<duration3?"ArrayList get":"LinkedList get")+"更快");System.out.println("--------------------------");System.gc();// ArrayList removestartTime = System.nanoTime();for (int i = 9999; i >= 0; i--) {arrayList.remove(i);}endTime = System.nanoTime();long duration4 = endTime - startTime;System.out.println("ArrayList remove: " + duration4);System.gc();// LinkedList removestartTime = System.nanoTime();for (int i = 9999; i >= 0; i--) {linkedList.remove(i);}endTime = System.nanoTime();long duration5 = endTime - startTime;System.out.println("LinkedList remove: " + duration5);System.out.println((duration4<duration5?"ArrayList remove":"LinkedList remove")+"更快");System.out.println("--------------------------");} }效果
添加和刪除操作上LinkedList更快,但在查詢速度較慢。所以很多時候具體問題具體分析。
但是如果是多線程的時候要選擇Vector方便一些同步好處理。
如果不涉及到多線程就從LinkedList、ArrayList兩個中選。
LinkedList更適合從中間插入或者刪除(鏈表的特性)。
ArrayList更適合檢索和在末尾插入或刪除(數組的特性)。
希望能對大家有一些幫助。
總結
以上是生活随笔為你收集整理的【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解(ArrayList、 LinkedList 和 Vector之间的区别)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【蓝桥杯Java_C组·从零开始卷】第八
- 下一篇: 风雨彩虹,铿锵玫瑰——女足夺冠