哪一个运行速度更快,ArrayList或LinkedList?

这个问题在这里已经有了答案:

  • 何时通过ArrayList使用LinkedList? 28个答案
  • ArrayList和LinkedList之间的性能差异9个答案

  • 如果你必须执行大量的插入和不太频繁的查找,请使用LinkedList 。 如果执行比插入更多的查找,请使用ArrayList

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

    现在要从ArrayList获取一个项目,它总是需要一段时间,因为它可以在一个固定的时间内轻松地为后备数组建立索引。 但是从LinkedList获取项目可能会导致您遍历整个链接列表以查找项目节点。 因此,在这种情况下,它比ArrayList执行的要少。

    从上面的讨论可以看出,当你有更多的插入操作时, LinkedList将总是胜过ArrayList因为后者有一个与插入相关的内部大小调整成本,而前者没有。 另一方面,如果你有不频繁的插入和频繁的查找, ArrayList将总是胜过LinkedList因为对于后者你可能必须遍历整个链表结构以找到想要的项目,而前者将能够快速找到你的项目数组索引在不变的时间。

    当你处理大量项目(比如说,成千上万的项目)时,上述所有效果都将可见并影响应用程序的性能。 对于较少的项目,性能差异不是很明显。

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

    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);
    }
    

    请参阅有效Java ,第23项:不要在新代码中使用原始类型以获得详细解释。

    编辑

    从评论中的讨论中可以明显看出,如果你需要在列表中间或随机位置插入元素,那么ArrayList在性能方面胜过LinkedList ,因为前者将使用memcpy来移动元素非常快,后者将不得不遍历所需的索引以正确插入新元素,这是较慢的。 所以对于随机插入, ArrayList也优于LinkedList 。 唯一的例子LinkedList优于ArrayList ,如果你只在列表的末尾插入,并且有很多插入。


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

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


    ArrayList由数组支持,并且LinkedList支持与引用链接的Node。

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

    并且在LinkedList所有操作的执行都可以像双链表一样执行。 索引到列表中的操作将从开始或结束遍历列表,以哪个更接近指定的索引为准。

    阅读更多关于文档 -

  • 数组列表
  • 链表
  • 链接地址: http://www.djcxy.com/p/19959.html

    上一篇: Which one runs faster, ArrayList or LinkedList?

    下一篇: Why is "final" not allowed in Java 8 interface methods?