【问题标题】:What is faster with item manipulation in Java ArrayList?Java ArrayList 中的项目操作更快的是什么?
【发布时间】:2023-03-08 15:00:01
【问题描述】:

我必须替换 ArrayList 中的一个元素。 哪个更快——使用remove()add() 还是获取所需的项目索引并使用set(int, E)

如果你知道一些类似主题的书,请给我一些建议。

【问题讨论】:

  • 数组没有这些操作。在数组列表中set 很可能是最快的,因为除了引用新对象之外不需要调整大小或节点操作。
  • set(int,E) 我猜更好,因为它直接替换了元素
  • 只是想知道:你做了一些分析,你确定你真的需要担心这些微妙之处吗?
  • @GhostCat 这不是一个微妙之处。
  • 就像一个想法,如果你必须经常这样做,LinkedList 会更快地替换元素。但是查找特定元素的速度较慢

标签: java performance object arraylist


【解决方案1】:

如果这是ArrayList的最后一项,几乎没有区别。在其他情况下 - set(int, E) 会更快,因为不需要复制数组的一部分

【讨论】:

    【解决方案2】:

    都在javadoc(强调我的):

    size、isEmpty、get、set、iterator 和 listIterator 操作在恒定时间内运行。添加操作在摊销常数时间内运行,即添加 n 个元素需要 O(n) 时间。所有其他操作都以线性时间运行(粗略地说)。

    回顾一下:set = O(1) 而 add/remove = O(n) ==> 使用 set

    【讨论】:

      【解决方案3】:

      remove(Object) 将在您的 ArrayList 中执行线性搜索,然后删除指定对象的第一次出现,这意味着在最坏的情况下您将获得 O(N) 复杂度。

      如果您已经知道要替换的索引,那么调用.set(index, object) 肯定会更快,但如果您不知道,则没有区别,因为在这两种情况下您都必须执行线性搜索,得到 O(N ) 复杂性。

      add(Object) 总是将对象添加到 ArrayList 的末尾,因此在 ArrayList 中添加单个对象的复杂度为 O(1)。

      【讨论】:

        猜你喜欢
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 2016-03-05
        • 2010-12-03
        • 2021-05-12
        • 2017-08-29
        • 1970-01-01
        相关资源
        最近更新 更多