您的位置:首页 > 编程语言 > Java开发

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 list 效率