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

在list中间插入的情况下,LinkedList真的比ArrayList快吗?

林辰钊
2023-03-14

-LinkedListArrayList有什么区别?什么时候使用LinkedList更好?

我想每个Java开发人员至少在面试中听过一次这个问题。

-如果您希望能够在列表中间插入项目,则首选链表。

从这里

忘了提到插入费用。在LinkedList中,一旦有了正确的位置,插入将花费O(1),而在ArrayList中,插入将上升到O(n)-所有超过插入点的元素都必须移动。

从这里

还有更多...

但你有没有尝试过自己复制它?我昨天试了一下,得到了这些结果:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String... args) {
        final int MAX_VAL = 10000;
        List<Integer> linkedList = new LinkedList<Integer>();
        List<Integer> arrayList = new ArrayList<Integer>();
        for(int i = 0; i < MAX_VAL; i++) {
            linkedList.add(i);
            arrayList.add(i);
        }
        long time = System.nanoTime();
        for(int i = 0; i < MAX_VAL; i++) {
            linkedList.add(MAX_VAL/2, i);
        }
        System.out.println("LL time: " + (System.nanoTime() - time));
        time = System.nanoTime();
        for(int i = 0; i < MAX_VAL; i++) {
            arrayList.add(MAX_VAL/2, i);
        }
        System.out.println("AL time: " + (System.nanoTime() - time));
    }
}

产出:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String... args) {
        final int MAX_VAL = 10000;
        List<Integer> linkedList = new LinkedList<Integer>();
        List<Integer> arrayList = new ArrayList<Integer>();
        for(int i = 0; i < MAX_VAL; i++) {
            linkedList.add(i);
            arrayList.add(i);
        }
        long time = System.nanoTime();
        for(int i = 0; i < MAX_VAL/2; i++) {
            linkedList.remove(MAX_VAL/2);
        }
        System.out.println("LL time: " + (System.nanoTime() - time));
        time = System.nanoTime();
        for(int i = 0; i < MAX_VAL/2; i++) {
            arrayList.remove(MAX_VAL/2);
        }
        System.out.println("AL time: " + (System.nanoTime() - time));
    }
}

哦,ArrayList还是比LinkedList快。原因何在?这个神话破灭了吗?也许我错了?

共有1个答案

洪星文
2023-03-14

破灭

不是真的。这里

for(int i = 0; i < MAX_VAL; i++) {
    linkedList.add(MAX_VAL/2, i);
}

你不只是插入项目;您每次都要付出从开始到i迭代的代价。当然,这是o(i)

    null
 类似资料:
  • 本文向大家介绍java中ArrayList与LinkedList对比详情,包括了java中ArrayList与LinkedList对比详情的使用技巧和注意事项,需要的朋友参考一下  ArrayList,LinkedList都是Collection接口的通用实现方式,两者采用了不用的存储策略,用来适应不同场合的需要。 实现方式   ArrayList的内部采用集合的方式存储数据 唯一需要注意的是对于

  • 问题内容: 我是Java新手。我想将ResultSet数据插入JavaFX TableView,但我不会使用中间类。我可以将ResultSet行插入到TableView行中作为对象吗? 这是我使用中间类单元的代码 控制者 问题答案: 您需要一些东西来保存数据。某些东西(您称为“中间类”)将成为您的的数据类型。 它不必一定是您创建的类,但是如果您仅使用一般性的东西,那么您的代码将很难理解。例如,您可

  • 我了解到是作为双链表实现的,它在添加和删除上的性能比好,但在get和set方法上的性能更差。 这是否意味着我应该选择而不是来插入? 我写了一个小测试,发现插入速度更快,那么链表怎么比快呢? 请参考下面我所做的例子。

  • 代码所做的是创建数组和链表,并为每个元素提供一个开始。然后,将对这两个数组运行,并在数组中的某个随机索引处插入一个随机值。它将添加到每个数组的值的数量由用户的输入决定。 因此,从根本上说,人们会认为函数返回这两种列表类型所需的时间相同(可能会稍微快一些)。但是,实际的结果似乎表明,比链表快得多,而不管您添加的元素数量如何(您可以在这里尝试一下)。 无论如何,我的猜测是,这可能与缓存有关,而且将为插

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