中间插入数据选择ArrayList还是LinkedList?
今天去面试,提到ArrayList和LinkedList的适用场景时,被问到:如果从中间插入数据时,是选择用ArrayList存储数据还是LinkedList存储数据好呢?
以前看到过相关的博客,回答了ArrayList效率更高,被追问为什么,然后我就一时懵逼,支支吾吾答不出来,面试官问LinkedList只是每次从两端向中间进行指针访问,找到位置后直接插入,相比于ArrayList每次插入都要将后续的元素后移并且还可能发生扩容操作,应该是LinkedList的效率更高啊???(弟弟的我只能回答不知道)
直接上测试:
/** * @author liuyiyuan * * 结果比较: * 1、先执行ArrayList 再执行LinkedList * 100000(10万条插入) ArrayList: 0.247 LinkedList:6.385 * 200000(20万条插入) ArrayList: 0.954 LinkedList:36.629 * 1000000(100万条插入) ArrayList已经跑不出来了超过20分钟了 * * 2、先执行LinkedList 再执行ArrayList * 100000(10万条插入) ArrayList: 0.205 LinkedList:6.344 * 200000(20万条插入) ArrayList: 0.925 LinkedList:34.366 */ public class ArrayListAndLinkedListTest { public static void main(String[] args) { int n = 200000; // 100000次 1000000次 // long start2 = System.currentTimeMillis(); // timeTest2(n); // long end2 = System.currentTimeMillis(); // System.out.println("LinkedList中间插入"+n+"数据耗时:"+(end2-start2)/1000D+" 秒"); long start1 = System.currentTimeMillis(); timeTest1(n); long end1 = System.currentTimeMillis(); System.out.println("ArrayList中间插入"+n+"数据耗时:"+(end1-start1)/1000D+" 秒"); long start2 = System.currentTimeMillis(); timeTest2(n); long end2 = System.currentTimeMillis(); System.out.println("LinkedList中间插入"+n+"数据耗时:"+(end2-start2)/1000D+" 秒"); } public static void timeTest1(int n){ ArrayList<Integer> a = new ArrayList<>(); for(int i=0; i<n; i++){ a.add(i/2, i); } } public static void timeTest2(int n){ LinkedList<Integer> a = new LinkedList<>(); for(int i=0; i<n; i++){ a.add(i/2, i); } } }
结果确实是ArrayList效率更高,但是为什么还是不知道????该怎么解释。。。。