当前位置: 首页 > 知识库问答 >
问题:

为什么在LinkedList中循环添加操作比ArrayList要长?

上官兴昌
2023-03-14

我不知道我错过了什么:

    public static void main(String[] args) {

    for (int i = 1000; i < 100000000; i *=5) {
        System.out.println(" - - - - ");
        System.out.println("size " + NumberFormat.getNumberInstance(Locale.US).format(i));
        List<Integer> list = new ArrayList<>();
        populateList(list, i);
        list = null;

        List<Integer>list2 = new LinkedList<>();
        populateList(list2, i);
    }

}

private static void populateList(List<Integer> list, long size) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < size; i++) {
        list.add(i);
    }
    long after = System.currentTimeMillis();
    System.out.println(list.getClass().getCanonicalName() + " Diff: " + (after - start));
}

输出结果是:

尺码1000

尺码25,000

ArrayList差异:3

LinkedList差异:2

尺码3,125,000

ArrayList差异:104

LinkedList差异:1254

共有1个答案

朱锐
2023-03-14

您将插入到ArrayListLinkedList都是O(1)的列表末尾,因为LinkedList实现是一个双链表,它也有一个尾指针。

若要在头部插入,请同时传递索引

list.add(0, i);

另请参见:如何用Java编写正确的微基准测试?

 类似资料:
  • 问题内容: 我试图理解 为什么Java的ArrayDeque比Java的LinkedList更好, 因为它们都实现了Deque接口。 我几乎看不到有人在他们的代码中使用ArrayDeque。如果有人对ArrayDeque的实现方式有了更多的了解,那将是有帮助的。 如果我理解它,我会更自信地使用它。对于JDK实现管理头和尾引用的方式,我不清楚。 问题答案: 链接结构可能是最糟糕的结构,要在每个元素上

  • 问题内容: 我了解这是作为双重链接列表实现的。它在add和remove上的性能优于,但在get和set方法上却较差。 这是否意味着我应该选择在插入? 我写了一个小测试,发现插入速度更快。那如何链表比? 请参考下面的示例。 问题答案: Linkedlist确实在插入时速度更快,问题出在您的示例中。在您的代码中,您一直都需要附加到末尾。对于ArrayList,它与LinkedList一样容易。您应该做

  • 正如我所知,ArrayList以2^n+1的大小复制数组。而linkedlist只更改节点

  • 问题内容: 在Java中ArrayList和LinkedList有什么区别?何时使用哪一个? 问题答案: 并且是接口的两种不同的实现。用双向链表实现它。用动态调整大小的数组实现它。 与标准的链表和数组操作一样,各种方法将具有不同的算法运行时。 对于 是O(n)(平均n/4步) 是O(1) 是O(n)(平均为n/4步),但是当(index = 0 —LinkedList 是O(n)(平均n / 4步

  • 我有一个游戏,每隔X秒它就会把内存中改变的值写回我的数据库。当编辑这些值保存的数据时,它们存储在容器(HashMaps和ArrayList)中。 为了简单起见,假设我只有一个容器可以写入数据库: 我的DB写入循环: 我的更新方法: 我是否需要在为dbEntitiesDeletesBacklog HashMap和本摘录中未包含的其他容器“保存到DB”时创建某种锁定机制?我想我需要这样做,因为它会创建

  • 问题内容: 我正在尝试通过数组列表使用foreach循环,但是当我使用它时,它会给我带来错误,但是当我使用正常的for循环时,它可以正常工作,这可能是什么问题? 代码在这里: 这是无效的循环,这是有效的循环: 使用foreach循环时出现的错误是: 问题答案: 终使用Immutable集合类并构建新的集合类,而不要尝试修改单个共享类,但我想使其更加明确。 Guava很好地支持这一点,用于传递数据。