Java 哪一个运行得更快,ArrayList还是LinkedList? List li=newlinkedlist(); for(int i=0;i 100;i++){ li.添加(i); } long start1=System.nanoTime(); 李,get(57),; long-end1=System.nanoTime(); 长diff1=end1-start1; System.out.println(“LinkedList=“+diff1”)占用的时间; List al=新的ArrayList(); 对于(int i=0;i来移动非常快的元素,后者必须遍历到所需的索引,才能正确地插入新元素,这会更慢。所以对于随机插入ArrayList也比LinkedList好。LinkedList优于ArrayList的唯一情况是,如果您只在列表末尾插入,并且有很多这样的插入。ArrayList由数组支持,而LinkedList支持的节点与referenece链接

Java 哪一个运行得更快,ArrayList还是LinkedList? List li=newlinkedlist(); for(int i=0;i 100;i++){ li.添加(i); } long start1=System.nanoTime(); 李,get(57),; long-end1=System.nanoTime(); 长diff1=end1-start1; System.out.println(“LinkedList=“+diff1”)占用的时间; List al=新的ArrayList(); 对于(int i=0;i来移动非常快的元素,后者必须遍历到所需的索引,才能正确地插入新元素,这会更慢。所以对于随机插入ArrayList也比LinkedList好。LinkedList优于ArrayList的唯一情况是,如果您只在列表末尾插入,并且有很多这样的插入。ArrayList由数组支持,而LinkedList支持的节点与referenece链接,java,performance,arraylist,collections,linked-list,Java,Performance,Arraylist,Collections,Linked List,无论我对这两个列表执行什么操作,当我打印出所花费的时间时,ArrayList总是比LinkedList运行得更快。 有人能解释一下哪一个在时间上表现更好吗? 如果代码中有错误,也请告诉我。谢谢 如果您必须执行大量插入而不是频繁查找,请使用LinkedList。如果执行的查找多于插入,请使用ArrayList 原因如下-ArrayList由具有初始容量的数组支持。因此,如果您继续将项目插入列表,它将不得不重新调整其阵列容量以适应新插入的项目,并且如果您执行索引特殊插入,它可能还必须移动现有项目。另

无论我对这两个列表执行什么操作,当我打印出所花费的时间时,ArrayList总是比LinkedList运行得更快。 有人能解释一下哪一个在时间上表现更好吗?
如果代码中有错误,也请告诉我。谢谢

如果您必须执行大量插入而不是频繁查找,请使用
LinkedList
。如果执行的查找多于插入,请使用
ArrayList

原因如下-
ArrayList
由具有初始容量的数组支持。因此,如果您继续将项目插入列表,它将不得不重新调整其阵列容量以适应新插入的项目,并且如果您执行索引特殊插入,它可能还必须移动现有项目。另一方面,
LinkedList
由一个链接列表支持,其中创建一个项目总是在一个固定的时间内执行-创建一个项目并将其分配到列表的末尾。这里没有重新调整

现在,要从
ArrayList
中获取一个项目,它将始终需要一个固定的时间量,因为它可以在一个固定的时间内轻松地索引支持数组。但是从
LinkedList
获取项目可能会导致您遍历整个链接列表以查找项目节点。因此,在这种情况下,它的性能低于
ArrayList

从上面的讨论中,您可以看到,当您有更多的插入要做时,
LinkedList
将始终优于
ArrayList
,因为后者具有与插入相关的内部调整大小成本,而前者没有。另一方面,如果插入和查找不频繁,
ArrayList
的性能总是优于
LinkedList
,因为对于后者,您可能需要遍历整个链表结构才能找到所需的项,而前者将能够以恒定的时间通过数组索引快速找到您的项

当您处理大量项目(例如,数千个项目)时,上述所有效果都将可见并影响应用程序的性能。对于较少的项目,性能差异不太明显

现在,关于你的代码,你有一些严重的问题。对于初学者,您使用的是原始类型,这很糟糕,因为您失去了泛型必须提供的所有类型安全性。编写新代码时,应始终使用集合API的通用版本。因此,按如下方式更改您的代码-

List li = new LinkedList();

for (int i = 0; i < 100; i++) {
    li.add(i);
}

long start1 = System.nanoTime();
li.get(57);

long end1 = System.nanoTime();
long diff1 = end1-start1;

System.out.println("Time taken by LinkedList = "+diff1);

List al = new ArrayList();
for (int i = 0; i < 100; i++) {
    al.add(i);
}
List li=newlinkedlist();
对于(int i=0;i<100;i++){
li.添加(i);
}
long start1=System.nanoTime();
李,get(57),;
long-end1=System.nanoTime();
长差1=端1-开始1;
System.out.println(“LinkedList=“+diff1”)占用的时间;
List al=新的ArrayList();
对于(int i=0;i<100;i++){
al.添加(i);
}
有关详细说明,请参见,第23项:不要在新代码中使用原始类型

编辑


从注释中的讨论中可以看出,如果需要在列表中间或随机位置插入元素,则<>代码> ARARYLIST/<代码>在性能方面优于<代码> LINKEDLIST/COD>,因为前者将使用<代码> MycPy < /代码>来移动非常快的元素,后者必须遍历到所需的索引,才能正确地插入新元素,这会更慢。所以对于随机插入

ArrayList
也比
LinkedList
好。
LinkedList
优于
ArrayList
的唯一情况是,如果您只在列表末尾插入,并且有很多这样的插入。

ArrayList
由数组支持,而
LinkedList
支持的节点与referenece链接

所以对
ArrayList
的操作实际上是对数组的求值操作。添加操作在摊销的固定时间内运行,即添加n个元素需要
O(n)
时间。所有其他操作都在线性时间内运行(粗略地说)。与
LinkedList
实现相比,常数因子较低

LinkedList
上,所有操作的执行与双链接列表的预期相同。索引到列表中的操作将从开始或结束遍历列表,以更接近指定索引的为准

阅读有关文档的更多信息-


LinkedList
将在添加每个元素时创建新节点,而该元素不在数组列表中

如果知道初始大小,则在创建时将其传递给
ArrayList
,这样可以避免重建阵列
新的数组列表(100)

数组列表的读取速度总是比链表快。ArrayList基本上是数组实现,为数组分配的内存是按顺序分配的,因此读取速度更快。但当您使用需要在列表之间插入或删除的列表时,链表会更快。因为它只需要在节点之间添加链接。在这两种情况下,数组列表的速度会较慢。用法可以是:

ArrayList-读取操作速度更快,列表之间的插入、删除速度较慢。
链表-与数组列表相比,读取操作速度较慢,但在列表之间插入、删除速度更快。

是否检查?此链接是100个循环中相关问题的第一个,差异可以忽略不计。尝试1000万或更多的循环。重复的和链接可能会有所帮助you@VaibhavDesai-成功了!我增加了要添加到列表中的元素的数量,现在我可以看到t
List<Integer> li = new LinkedList<Integer>();
for (int i = 0; i < 100; i++) {
    li.add(i);
}

long start1 = System.nanoTime();
li.get(57);

long end1 = System.nanoTime();
long diff1 = end1 - start1;

System.out.println("Time taken by LinkedList = "+diff1);

List<Integer> al = new ArrayList<Integer>();
for (int i = 0; i < 100; i++) {
    al.add(i);
}