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

 

posted @   originyuan  阅读(595)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示