【问题标题】:Is an ArrayList or a LinkedList better for sorting?ArrayList 还是 LinkedList 更适合排序?
【发布时间】:2011-12-25 13:03:15
【问题描述】:

我想使用需要不时排序的数据结构。数据结构的大小几乎不会超过 1000 项。

哪个更好 - ArrayListLinkedList

哪种排序算法更好用?

【问题讨论】:

  • 你的假设是什么?当你检验你的假设时,你学到了什么?
  • 看看这个,我相信你会自己得出一个结论。问候! stackoverflow.com/questions/322715/…
  • 在您考虑的尺寸下,两者都相同,我 100% 这将不会成为您应用程序的瓶颈。始终对自己进行自我介绍,看看你在数据中发现了什么,只有你能做到!
  • 堆不是最好的吗?
  • 注意:海报下方的评论中指出,最大列表大小将来可能会超过 1000 项。

标签: java sorting data-structures


【解决方案1】:

直到 Java 7,这没有什么区别,因为 Collections.sort 会将列表的内容转储到一个数组中。

在 Java 8 中,使用 ArrayList 应该会稍微快一些,因为 Collections.sort 将调用 List.sort,而 ArrayList 有一个专门的版本,可以直接对后备数组进行排序,从而节省一份副本。

所以底线是ArrayList 更好,因为它提供了相似或更好的性能,具体取决于 Java 版本。

【讨论】:

    【解决方案2】:

    如果您要使用java.util.Collections.sort(List),那真的没关系。

    如果List 没有实现RandomAccess,那么它将被转储到List 该列表将被转储到一个数组中以进行排序。

    (感谢 Ralph 让我诚实。看来我混淆了 sort 和 shuffle 的实现。它们足够接近同一件事,对吧?)

    【讨论】:

    • 这不是 java 文档所说的或实现所做的(或者至少我是这样理解的):JavaDoc“这个实现将指定的列表转储到一个数组中,对数组进行排序,然后迭代列表重置每个元素”——它转储到一个数组(不是一个列表)中,不管它是否实现了 RandomAccess。
    【解决方案3】:

    如果您可以使用 Apache 库,请查看 TreeList。它正确地解决了您的问题。

    【讨论】:

    • 或者只是标准的TreeSet,没有额外的依赖。
    • TreeSet 不使用索引提供访问权限
    【解决方案4】:

    只有 1000 件商品?你为什么在乎?

    除非我有特殊需要,否则我通常总是使用 ArrayList。

    查看源代码。如果我没记错的话,我认为无论如何排序都是基于数组的。

    【讨论】:

    • 我很在意,因为它不是最终尺寸。它可能会随着时间的推移而增加
    【解决方案5】:

    如果您只是排序而不是动态更新排序列表,那么两者都可以,并且数组将更节省内存。如果您想维护排序列表,链接列表确实更好。将对象插入到链表的中间速度很快,但插入到数组中速度很慢。

    如果你想在中间找到一个对象,数组会更好。使用数组,您可以进行二进制排序并在 O(logN) 时间内查找成员是否在列表中。使用链表,您需要遍历整个列表,非常慢。

    我猜哪个更适合您的应用程序取决于您想要对排序后的列表做什么。

    【讨论】:

    • 将对象插入链表的中间速度很快,但插入数组的速度很慢。 但是,在链接中查找要插入的位置需要 O(n) 时间在 ArrayList 中列出与 O(log n) 的对比。复杂性是一种洗涤。实际上,在 Java 中对链表进行排序(即Collections.sort())速度可以接受的唯一原因是因为它将整个列表转储到数组列表中并对其进行排序,然后将其转储回链表。
    • 对于大型数据集来说,复杂性是一种清洗,并且内存中的本地访问速度要快得多(我看到和测试的实验大约是 40%)。
    猜你喜欢
    • 2011-08-18
    • 2013-09-15
    • 2020-10-17
    • 2019-07-26
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2014-01-08
    相关资源
    最近更新 更多