实际上,我已经尝试了this link相关的Arraylist与LinkList相关的示例。但是我的问题是不同机器的性能不同,在我从stackoverflow中读出一个问题之前就是这样。
Performance differences between ArrayList and LinkedList
package com.demo.collections;
import java.util.ArrayList;
import java.util.LinkedList;
public class ArraylistAndLinklist {
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 j = 0; j < 100000; j++) {
linkedList.add(j);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList add: " + duration);
// ArrayList get
startTime = System.nanoTime();
for (int k = 0; k < 10000; k++) {
arrayList.get(k);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("ArrayList get: " + duration);
// LinkedList get
startTime = System.nanoTime();
for (int l = 0; l < 10000; l++) {
linkedList.get(l);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList get: " + duration);
// ArrayList remove
startTime = System.nanoTime();
for (int m = 9999; m >=0; m--) {
arrayList.remove(m);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("ArrayList remove: " + duration);
// LinkedList remove
startTime = System.nanoTime();
for (int n = 9999; n >=0; n--) {
linkedList.remove(n);
}
endTime = System.nanoTime();
duration = endTime - startTime;
System.out.println("LinkedList remove: " + duration);
}
1st.machine输出:
ArrayList add: 24675693
LinkedList add: 15693734
ArrayList get: 3464166
LinkedList get: 131314610
ArrayList remove: 344500934
LinkedList remove: 127862009
第二。机器输出:
ArrayList add: 13265642
LinkedList add: 9550057.
ArrayList get: 1543352
LinkedList get: 85085551
ArrayList remove: 199961301
LinkedList remove: 85768810
有人可以告诉我:
我有一些问题
1.为什么不同机器的性能会有所不同?
2.为什么arraylist添加和删除比linklist慢?
3.为什么Arraylist变得更快?
4.在哪种情况下,应该更喜欢链接列表?
答案 0 :(得分:3)
1.为什么不同机器的性能会有所不同?
这可能是由许多因素造成的。对于此示例,RAM的速度可能是最大的贡献者,但CPU速度,系统负载等都可以影响性能。这种类型的差异是好的和预期的。
2.为什么arraylist添加和删除比linklist慢?
在这个庞大的数据集中,数组列表将间歇性地耗尽数组中的空间,它在内部保存数据。发生这种情况时,数组将需要调整大小,这意味着创建一个新的更大的数组并复制所有数据(非平凡的任务)。删除可能需要移动数组中的后续元素。这是类似的。
3.为什么Arraylist变得更快?
Arraylist get可以在O(1)时间(恒定时间)内完成,因为它只是内部数组中的偏移内存查找。但是,链接列表必须遍历列表才能找到该元素。这需要O(n)时间(线性时间)。
4.在哪种情况下,应该更喜欢链接列表?
如果您执行的插入/删除操作多于查找,则链接列表的性能可能优于arraylist。相反,如果您正在进行更多的查找操作,那么arraylist可能会为您提供更好的性能。
答案 1 :(得分:0)
因为ram(大多数情况下)或jvm,OS等的速度
因为有时数组不长,有时它很大 - &gt;调整大小需要很多时间
因为您可以在O(1)时间内获取数据,并且对于您的链表,您的get实现很糟糕(您遍历所有节点直到第j个节点)。通常你在O(1)的链表中得到你的迭代数据,但你有O(n)
对于大数据,因为你不必找到一块足够大的数据块。链表可以通过ram
它帮助我自己编写一个链表和一个arraylist来更好地理解它们