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。