LinkedList 增删真的比ArrayList快吗?
2015-10-05 20:41
686 查看
理论上、教材上都说LinkedList的增删比ArrayList快,但真的是这样吗?
口说无凭,上代码:
package com.zxz.listTest; import java.util.ArrayList; import java.util.LinkedList; import java.util.Random; public class listSpeedTest { public static void main(String[] args) { ArrayList<Double> arrayList = new ArrayList<Double>(); LinkedList<Double> linkedList = new LinkedList<Double>(); Long[] time = new Long[10]; int listSize = 10000; Random random = new Random(); // create ArrayList System.out.println("Create Time"); time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { arrayList.add(Math.random()); } time[1] = System.currentTimeMillis(); System.out.println("ArrayList:" + (time[1] - time[0])); // create LinkedList time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { linkedList.add(Math.random()); } time[1] = System.currentTimeMillis(); System.out.println("LinkedList:" + (time[1] - time[0])); System.out.println(); // visit ArrayList System.out.println("Vistit Time"); time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { arrayList.get(random.nextInt(listSize)); } time[1] = System.currentTimeMillis(); System.out.println("ArrayList:" + (time[1] - time[0])); // visit LinkedList time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { linkedList.get(random.nextInt(listSize)); } time[1] = System.currentTimeMillis(); System.out.println("LinkedList:" + (time[1] - time[0])); System.out.println(); // insert ArrayList System.out.println("Inset Time"); time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { arrayList.add(random.nextInt(listSize), random.nextDouble()); } time[1] = System.currentTimeMillis(); System.out.println("ArrayList:" + (time[1] - time[0])); // insert LinkedList time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { linkedList.add(random.nextInt(listSize), random.nextDouble()); } time[1] = System.currentTimeMillis(); System.out.println("LinkedList:" + (time[1] - time[0])); System.out.println(); // remove ArrayList System.out.println("Remove Time"); time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { arrayList.remove(random.nextInt(listSize)); } time[1] = System.currentTimeMillis(); System.out.println("ArrayList:" + (time[1] - time[0])); // remove LinkedList time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { linkedList.remove(random.nextInt(listSize)); } time[1] = System.currentTimeMillis(); System.out.println("LinkedList:" + (time[1] - time[0])); System.out.println(); // set ArrayList System.out.println("Set Time"); time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { arrayList.set(random.nextInt(listSize), random.nextDouble()); } time[1] = System.currentTimeMillis(); System.out.println("ArrayList:" + (time[1] - time[0])); // set LinkedList time[0] = System.currentTimeMillis(); for (int i = 0; i < listSize; i++) { linkedList.set(random.nextInt(listSize), random.nextDouble()); } time[1] = System.currentTimeMillis(); System.out.println("LinkedList:" + (time[1] - time[0])); } }
运行结果:
Create Time ArrayList:15 LinkedList:0 Vistit Time ArrayList:0 LinkedList:63 Inset Time ArrayList:47 LinkedList:235 Remove Time ArrayList:47 LinkedList:305 Set Time ArrayList:0 LinkedList:171
从运行结果可以看到,实际情况是ArrayList的增删速度要比LinkedList快5~6倍。
为什么结论和之前大家常认为的不一样呢?
因为之前大家讨论增删的时候,只考虑的“增删”本身的时间消耗,从数据结构上来分析LinkedList自然要快。
但是我们忽视了一点,
增删操作还包括找到指定数据这么一个
检索环节。也就是
增删操作实际花费的时间 = 检索时间 + 增删操作动作本身的时间。
虽然LinkedList的增删动作本身的时间比ArrayList要段,但前者检索用的时间比ArrayList长得多。所以总时间反而变得长了。
启示:理论往往具有一定的片面性,实践是检验真理的为标准。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统