中间插入数据选择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效率更高,但是为什么还是不知道????该怎么解释。。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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的设计差异
· 三行代码完成国际化适配,妙~啊~