1 public class ArrayAndLinkedList { 2 List<String> arrayList = new ArrayList<String>(); 3 List<String> linkedList = new LinkedList<String>(); 4 5 void add(List<String> list){ 6 long startTime = System.currentTimeMillis(); 7 System.out.println("開始時間:"+startTime); 8 for(int i=0;i<20000;i++){ 9 // list.add(0,String.valueOf(i)); //數據越大LinkedList越快 10 // ArrayList: 11 // 開始時間:1547690654762 12 // 結束時間:1547690658732 13 // 總耗時:3970 14 // LinkedList: 15 // 開始時間:1547690658732 16 // 結束時間:1547690658828 17 // 總耗時:96
總結:當list在指定插入坐標位置時,LinkedList的插入速度明顯要比ArrayList快,且隨着數據的增大差距越加明顯
18 19 list.add(String.valueOf(i)); //數據小時LinkedList快,數據越大ArrayList越快 20 // i = 20,000 時: 21 // ArrayList: 22 // 開始時間:1547691354123 23 // 結束時間:1547691354136 24 // 總耗時:13 25 // LinkedList: 26 // 開始時間:1547691354137 27 // 結束時間:1547691354142 28 // 總耗時:5 29 30 // i = 200,000時: 31 // ArrayList: 32 // 開始時間:1547690710382 33 // 結束時間:1547690710432 34 // 總耗時:50 35 // LinkedList: 36 // 開始時間:1547690710433 37 // 結束時間:1547690710571 38 // 總耗時:138
總結:當list插入數據在尾部且數據量較小時,LinkedList的插入速度要比ArrayList快;
當list插入數據在尾部且數據量較大時,LinkedList的插入速度要比ArrayList慢,且隨着數據量的增大差距越加明顯
39 } 40 long endTime = System.currentTimeMillis(); 41 System.out.println("結束時間:"+endTime); 42 System.out.println("總耗時:"+ (endTime - startTime)); 43 } 44 @Test 45 public void addTimeTest(){ 46 System.out.println("ArrayList:"); 47 add(arrayList); 48 System.out.println("LinkedList:"); 49 add(linkedList); 50 51 } 52 53 }
分析:
ArrayList是基於數組的增加,當在指定位置進行一個插入時需要移動原有數據位置;
LinkedList是基於雙向鏈表的增加,因為鏈表中每一個節點之間都存在相互引用,那么數據在插入時只需要把指針移到對應的節點即可。
所以在指定位置進行插入時,LinkedList的速率要優於ArrayList。
當數據只是追加在尾部時,由於ArrayList是擴容的方式,LinkedList是需要新建立節點。當數據量很大的時侯new節點的時間會大於擴容的時間,
所以ArrayList插入的速度就會優於LinkedList。