【问题标题】:Java /Android what is faster than ArrayList?Java/Android 什么比 ArrayList 快?
【发布时间】:2011-11-30 10:58:14
【问题描述】:

在 Java 中什么比 ArrayList<String> 更快?我有一个未定义长度的列表。 (有时 4 项,有时 100 项)。

从任何列表中添加和获取它的最快方法是什么? arrayList.add(string)get() 非常慢。

有没有更好的方法呢? (string s[] 然后copyArray 最慢?)

【问题讨论】:

  • 我想没有比通过索引插入和检索数组列表更快的方法了。

标签: java android


【解决方案1】:

更快是为了什么?

“基本上 arraylist.add(string) 和 get() 很慢。” - 基于什么证据?和什么相比? (这里不需要“基本上”这个词 - 这是一个高科技“嗯”。)我怀疑 ArrayList 是你的应用程序的问题。分析您的代码是判断您是否只是在猜测和抓住稻草的唯一方法。

如果数据集很小,即使是 O(n^2) 的算法也可能足够。

您必须了解不同数据结构的 Big-Oh 行为才能回答这个问题。添加到 ArrayList 的末尾非常快,除非您必须调整它的大小。在中间添加可能需要更长的时间。

LinkedList 在中间添加会更快,但您必须迭代才能到达特定元素。

【讨论】:

  • 它要附加在末尾,这非常慢。我等了很长时间(几秒钟)来附加一小部分 100 个整数。这真的很慢。
  • 你等了六个月才看到这条评论?我想我的回答已经涵盖了它。看到关于“除非你必须调整它”的部分吗?也许您需要考虑您的初始大小和调整大小的行为。
【解决方案2】:

add() 到列表末尾和get() 都应该在 O(1) 中运行。而且由于长度未定义,您不能使用固定长度的数组。恐怕你不能做得更好。

add(int index, E element) 在最坏的情况下需要线性时间,但如果这就是你认为它很慢的原因。如果是这种情况,请使用 Hashtable(插入需要恒定时间)或 TreeMap(插入需要对数时间)。

【讨论】:

    【解决方案3】:

    100 项不是很多。你的瓶颈在别处。

    【讨论】:

      【解决方案4】:

      看看Jodd Utilities。他们有一些实现 ArrayList 的集合,但在基元 (jodd/util/collection/) 上,例如 IntArrayList。因此,如果您要创建一个包含 int、float、double 等的 ArrayList。它会更快并且消耗更少的内存。

      比这更快的是他们所谓的 FastBuffer,它擅长 add() 并且可以在 O(1) 时提供 get()。

      这些类几乎没有相互依赖关系,因此只需将所需的类放入代码中即可。

      【讨论】:

        【解决方案5】:

        您可以使用 javolution 库。 http://javolution.org

        http://javolution.org/target/site/apidocs/javolution/util/FastList.html

        ist 比 arraylist 快得多;)

        【讨论】:

          【解决方案6】:

          尝试使用 hashtable 会快很多

          【讨论】:

            猜你喜欢
            • 2014-12-24
            • 2018-12-27
            • 2021-12-19
            • 2014-02-19
            • 1970-01-01
            • 2012-06-14
            • 2011-05-29
            • 2019-11-02
            • 2018-08-12
            相关资源
            最近更新 更多