当我分别跑步时:
package containers;
import java.util.*;
public static void main(String[] args) {
List<Integer> arLst = new ArrayList<Integer>();
List<Integer> lnLst = new LinkedList<Integer>();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
arLst.add(i);
}
System.out.println("Array list: "+Long.toString(System.currentTimeMillis()-start));
start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
lnLst.add(i);
}
System.out.println("Linked list: "+Long.toString(System.currentTimeMillis()-start));
}
我的执行时间大致相同。 我知道LinkedList的添加时间应该更快。 我想知道为什么..(对于中间插入和最后一个elemnt都是有意义的 - 因为数组在O(1)中知道要插入的位置,不像LinkedList那样必须通过整个列表,我记得。)
答案 0 :(得分:4)
两个列表都知道列表末尾的位置,因此插入时间几乎相同。我希望LinkedList稍慢,因为它为每个元素创建一个节点并使用更多内存。
我得到了
TIntArrayList - 141 ms
ArrayList<Integer> - 810 ms
LinkedList<Integer> - 5190 ms.
TIntArrayList不会更有效地使用缓存为每个元素创建一个对象。
答案 1 :(得分:4)
您的列表都是ArrayList
...如果您将其更改为LinkedList
,您也不会发现任何重大差异。按照您的方式构建ArrayList
,每次插入都会分摊O(1)的复杂性。
答案 2 :(得分:3)
您的代码与您的解释不同。但是,这是您的问题的答案:
答案 3 :(得分:2)
Ammm .... 也许这个:
List<Integer> lnLst = new ArrayList<>();
应如下所示:
List<Integer> lnLst = new LinkedList<>();
我无法理解你想要衡量的是什么。我认为您要测量add
性能,然后您的代码应如下所示:
public static void main(String[] args) {
List<Integer> arLst = new ArrayList<Integer>();
List<Integer> lnLst = new LinkedList<Integer>();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
arLst.add(i);
}
System.out.println("Array list: "+Long.toString(System.currentTimeMillis()-start));
start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
lnLst.add(i);
}
System.out.println("Linked list: "+Long.toString(System.currentTimeMillis()-start));
}
答案 4 :(得分:0)
...因为数组在O(1)中知道要插入的位置,而不像LinkedList那样 我记得,仔细阅读整个清单。
这不正确。数组(不是ArrayLists)没有恒定的插入时间,Java的ArrayList 技术上也没有(添加操作在分摊的常量时间中运行)。
此外,将元素插入链接列表是O(1)
:
除了实现List接口之外,还有LinkedList类 提供统一命名的方法来获取,删除和插入元素 在列表的开头和结尾。
如果要插入排序列表,复杂性将变为O(N)
。