中间插入数据选择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效率更高,但是为什么还是不知道????该怎么解释。。。。

原文地址:https://www.cnblogs.com/liuyiyuan/p/13829018.html