【问题标题】:ArrayList vs LinkedList efficiencyArrayList vs LinkedList 效率
【发布时间】:2017-10-20 11:21:50
【问题描述】:

我有一个问题,在开始时在列表中使用了许多插入,然后搜索和检索操作被广泛使用,那么哪种方法是好的和有效的?

方法 1: 使用 LinkedList 作为整个程序的数据结构。

方法 2: 使用 ArrayList 作为整个程序的数据结构。

方法 3: 在开头使用LinkedList 作为我的数据结构进行插入并执行 Arraylist al = new Arraylist(ll); 用于检索操作。

改变数据结构的成本是多少?真的值得吗?

【问题讨论】:

  • 将链接列表转换为数组列表是 O(n)。如果这对您的情况有意义,那么这样做是完全合理的。但是除非你知道你有效率问题,否则你可能会使用一个数组列表来处理整个事情。
  • 一般来说,如果一个列表被多次读取,最好选择ArrayList,因为它提供随机访问。另一方面,如果元素被多次添加到列表中(在随机位置),那么最好使用 LinkedList。
  • @khelwood ArrayList 怎么样?它依赖于System.arraycopy,这是一个原生方法,所以我想它应该更快和优化?
  • @BackSlash Faster 用于哪些操作?针对什么进行了优化?
  • 一种可行的方法 #4 可能是附加到 ArrayList 并在执行检索之前对其进行排序。

标签: java arraylist linked-list


【解决方案1】:

由于它们都实现了相同的接口,您可以通过编写代码自行发现这一点,以便可以插入构造函数并以两种方式测试您的代码。可以使用jmh 进行基准测试。

您可以使用Supplier 接口插入构造函数。

根据问题的性质,您可能会发现使用Deque 是合适的。

【讨论】:

    【解决方案2】:

    请允许我提出第 4 种方法:在整个程序中使用 ArrayDeque。它在前面和后面都有高效的插入(可能比LinkedList 更快)和像ArrayList 这样的搜索效率。 ArrayDeque 是 Java Collections Framework 中一个被不公平地忽视的类,可能是因为它是后来添加的(我认为是 Java 6)。它确实实现了List 接口,因此您必须专门为它编写程序。

    除此之外,您的问题仅有两个有效答案

    1. 在绝对需要之前不要担心效率。
    2. 如果并且当您必须担心效率时,您必须自行衡量在您的 环境中对您的 数据的性能是否令人满意。这里没有人能告诉你。

    【讨论】:

      【解决方案3】:

      这取决于插入和检索操作的频率。以下是复杂性:

      • ArrayList -> 开头插入:O(n)
      • ArrayList -> 基于索引检索:O(1)
      • LinkedList -> 开头插入:O(1)
      • LinkedList -> 基于索引检索:O(i) 其中 i 是要扫描的元素数。

      因此,如果您的检索次数多于插入次数,请选择ArrayList,如果没有,请选择LinkedList

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 2021-12-19
        • 2016-03-16
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-17
        • 1970-01-01
        相关资源
        最近更新 更多