【发布时间】:2021-02-06 09:34:16
【问题描述】:
据我所知,ArrayList 在获取时应该更快,在添加和删除时应该更慢。鉴于此 - 如果这段代码产生完全不同的结果,您能否给我一个提示:删除时间对于 ArrayList 和 LinkedList 几乎相同,而对于 ArrayList,添加速度更快...
import java.util.ArrayList;
import java.util.LinkedList;
public class ListsTest {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
LinkedList linkedList = new LinkedList();
// ArrayList add
long startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
arrayList.add(i);
}
long endTime = System.nanoTime();
long duration = endTime - startTime;
System.out.println(" ArrayList add: " + duration);
// LinkedList add
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
linkedList.add(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList add: " + duration);
// ArrayList get
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
arrayList.get(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println(" ArrayList get: " + duration);
// LinkedList get
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
linkedList.get(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList get: " + duration);
// ArrayList remove
startTime = System.nanoTime();
for (int i = 9999; i >=0; i--) {
arrayList.remove(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println(" ArrayList remove: " + duration);
// LinkedList remove
startTime = System.nanoTime();
for (int i = 9999; i >=0; i--) {
linkedList.remove(i);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList remove: " + duration);
}
}
我的结果:
ArrayList add: 13540332
LinkedList add: 93488785
ArrayList get: 676937
LinkedList get: 335366109
ArrayList remove: 529793354
LinkedList remove: 410813052
编辑: 正如在一些 cmets 中提到的,重要的是我们是否添加/删除/获取到/从列表的末尾或我们是否使用随机索引。使用随机索引时,所有结果都是“正确的”:
arrayList.get((int) (Math.random()*arrayList.size()));
同样的问题在这里得到解决: https://coderanch.com/t/669483/certification/ArrayList-LinkedList-speed-comparison
【问题讨论】:
-
Java 中的微基准测试确实很难准确进行,原因有很多,例如 JVM 是一个黑匣子,JIT 编译部分代码而其他部分不编译,等等等等。例如,您一个接一个地进行测试这一事实可能已经影响了结果
-
添加到 ArrayList 的末尾非常快,因为不需要复制现有条目,除非偶尔调整列表大小几次。当您向列表的开头移动时,添加速度会变慢。
标签: java