【问题标题】:comparing arraylist and linkedlist...is my code wrong?比较arraylist和linkedlist...我的代码错了吗?
【发布时间】:2026-01-31 01:15:01
【问题描述】:

我在另一个问题中问为什么在读取文件和创建列表时,arraylist 似乎比linkedlist 更快。我现在尝试添加到列表的前面或列表的后面。 Arraylist 还是更快。

我只是想确保我正确使用了这些东西。这就是我正在做的事情:

public class LinkedListTest {

    private List<String> Names;

    public LinkedListTest(){
            Names = new LinkedList<String>();
    }

然后我只使用链表方法,即“Names.add(strings)”。当我测试数组列表时,它几乎是相同的:

public class ArrayListTest {

    private List<String> Names;

    public ArrayListTest(){
            Names = new ArrayList<String>();
    }

我做得对吗?事实上,将构造函数方法中的列表类型从 ArrayList 更改为 LinkedList 几乎是我在比较速度时在代码中所做的唯一更改。这是正确的做法吗?

编辑: 哦,我只是在 add 函数之前和之后做 System.currentTimeMillis() 来测量时间。

【问题讨论】:

  • 发布你的完整基准测试——为 JVM 编写正确的微基准测试并不那么容易(例如,你最好在基准测试之前至少调用每个方法一次 [我认为最多几千次] 等等) .我敢打赌,在您的第一次测试中,类加载器还必须加载其他一些东西,等等。

标签: java arraylist linked-list


【解决方案1】:

然后我只使用链表方法 即“Names.add(字符串)”。当我 测试数组列表,它几乎 相同:

你是如何测试的?通常,它是通过测量执行相同操作所需的时间数百万次,然后进行简单的除法来完成的。

【讨论】:

  • 我在添加名称函数之前和之后做了 System.currentTimeMillis() 并减去了值。
  • 函数在两次调用之间运行了多少次?一个调用不应该花费接近一毫秒的时间,即使它真的很低效。
  • 该函数被调用了一次。该函数读取了 130,000 行文本文件(130,000 次 ListType.add() 调用)。
  • 这意味着您将始终添加到集合的末尾,显然数组是实现它的最有效方式。然后你也只调用了一次函数,这意味着 VM 解释了代码,这使得结果非常无趣。
  • 文件?那将是 I/O!这不会给你一个真正的时间度量。
【解决方案2】:

是的,你正确地使用了这些。您正在测试多少数据?如果数据集太小,您可能无法获得良好的测试结果,因为可能会出现特殊情况优化导致结果出现偏差。对于您的时间安排,您应该对多次测试运行的时间进行平均,以确保平均 CPU 负载峰值和其他资源峰值。

我不确定,但我建议尝试不同数量的测试数据 - 可能会增加 10 倍,看看您是否看到性能的线性变化。例如,您可以用 100 个项目、1000、10000、100000 和 1000000 测试每个列表,看看差异是否是线性的,以及实现的比较。

除了在开头和结尾插入之外,测试将项目插入列表中间所需的时间可能会很有趣。

【讨论】:

  • 我使用的测试文件有 130,000 个名字。
【解决方案3】:

如果您想要简单的东西,简单的时间增量很好,但是如果您想要更复杂的东西,请查看以下内容以供将来参考:

http://www.ibm.com/developerworks/java/library/j-benchmark1.html

【讨论】:

  • 我刚刚做了两个单独的课程。但看来我做得对。而linkedlist只是更慢......对于一切......一直。嗯。测试功能也没什么了不起。只是一个 for 循环,它逐行接收文本文件,直到 null...输入列表中的每一行。
最近更新 更多