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

  • 相关阅读:
    goweb-goweb基础
    玩转Git
    程序爱好者的常用网站
    高等数学思维导图——6.微分方程
    前端趣玩——超炫的聚光灯效果
    Python课程笔记(四)
    高等数学思维导图——5.多元函数微分法及其应用
    算法很美(四)
    第五章——定积分必记公式
    十大经典排序算法
  • 原文地址:https://www.cnblogs.com/liuyiyuan/p/13829018.html
Copyright © 2020-2023  润新知