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

add方法的时间比较:ArrayList、LinkedList、ArrayList(用某个值初始化)

孔宇
2023-03-14

我希望了解更多关于数据结构和它们的实现(在JAVA语言中)。今天我写了一个测试来比较ADT列表的不同实现(时间比较)。具体来说,我比较了add方法,下面是我的测试:

@Test
public void testTime() {
    long i = 10000000;
    long INITIALIZED_VALUE=5000000;
    List<Integer> arrayBasedList = new ArrayList<Integer>();
    List<Integer> linkedBasedList = new LinkedList<Integer>();
    List<Integer> arrayBasedInitialedSizeList = new ArrayList<Integer> (INITIALIZED_VALUE);

    long t1 = System.currentTimeMillis();
    for (int index = 0; index <= i; index++) {
        arrayBasedList.add(index);
    }
    long t1End = System.currentTimeMillis() - t1;

    long t2 = System.currentTimeMillis();

    for (int index = 0; index <= i; index++) {
        linkedBasedList.add(index);
    }
    long t2End = System.currentTimeMillis() - t2;

    long t3 = System.currentTimeMillis();
    for (int index = 0; index <= i; index++) {
        arrayBasedInitialedSizeList.add(index);
    }
    long t3End = System.currentTimeMillis() - t3;

    System.out.println("ArrayBased: " + t1End);
    System.out.println("LinkedList:" + t2End);
    System.out.println("ArrayBasedInitializedSize: " + t3End);

    System.out.println("End");
}

我得到了这个结果:

ArrayBased:5681 LinkedList:12830 ArrayBasedInitializedSize:858

共有1个答案

浦琪
2023-03-14

这里有两件事。

首先,您的时间安排是不可靠的,因为您没有在每次运行之前“预热”代码。Java在运行代码时会优化和编译代码,所以最初几次通过代码要比后面运行慢得多。您应该运行数百次测试循环,扔掉这些结果,然后进行计时。

不过要回答这个问题:

O(1)所说的是,无论列表中有多少对象,它仍然需要相同的时间。在10个项目列表,100个项目列表,10000个项目列表的末尾添加一些东西仍然需要同样的时间。

不过,LinkedList比ArrayList花费更多的时间--尽管它们仍然具有相同的O(1)顺序。

事实上,速度上的差异是如此之大,即使将LinkedList为O(1),ArrayList为O(n),ArrayList对于小列表仍然更快!

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

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

  • 问题内容: 我有2个字符串对象的arraylists。 我有一些逻辑需要处理源列表,最终会得到目标列表。目标列表将有一些其他元素添加到源列表或从源列表中删除。 我的预期输出是string的2 ArrayList,其中第一个列表应具有从源中删除的所有字符串,第二个列表应具有所有新添加到源中的字符串。 有没有更简单的方法来实现这一目标? 问题答案: 将列表转换为 并使用 输出: [编辑] 其他方式(更

  • 我在尝试将add方法用于ArrayList时出现此错误。我可以看到很多人都有同样的问题,但他们在向arraylist添加元素之前没有初始化arraylist。但我正在尝试添加,而且,我仍然要求控制台返回消息arraylist在方法之前是否为null,并且它返回false。 系统出来println(消息==空);打印错误。我还尝试在开始时初始化messages ArrayList,而不仅仅是声明。有

  • 我正在做一个学校作业,我必须检查ArrayList teKoop中的某些对象是否不在ArrayList mijnGames中,问题是我一直设置这个错误代码:索引1 out of length 1 out of bounds for length 1 这里有什么明显的问题吗? 如有任何帮助,我们将不胜感激。 因此indexOutOfBound错误已修复,新问题出现:s 它一直返回给我一个空的Arra

  • 为什么我可以初始化ArrayList,如下所示: 但在使用时出错: