1

我想存储 50000 个或更多字符串,我需要执行几个操作,例如检索特定字符串、删除特定字符串等。我只有两个选项可供选择,它们是数组列表和存储它们的数组. 从性能的角度来看,哪个更好?

4

7 回答 7

3

两者都不。如果您想检索特定字符串(例如获取字符串“Foo”)并删除特定字符串(例如删除“Foo”),我会考虑使用Set.

数组列表或数组将为您提供 O(N) 检索(除非您对其进行排序)。ASet通常会给您至少 O(lg N) 时间来查找特定项目。

于 2012-04-10T17:04:21.637 回答
1

ArrayList由数组支持,因此在性能方面您应该看不到任何区别。

如果您的要求没有错误,并且确实您只能在数组列表和原始数组中进行选择,我建议您使用数组列表,因为您拥有所有 API 来操作您必须自己为原始数据编写的可用数据s 的数组String

于 2012-04-10T17:01:52.153 回答
1

数组在性能方面比数组列表更有效,但除非您知道要放入数组中的元素数量,否则数组列表将是更好的选择,因为数组列表的大小可以根据需要增长,而静态数组则不能。

于 2012-04-10T17:05:18.673 回答
1

数组总是比ArrayList. 部分原因是,当使用数组时,您不必支付对其元素进行类型转换的额外成本(使用泛型并不意味着类型转换消失,只是它们从普通视图中隐藏)。

说明我的观点:Trovefastutil是两个非常快速的 Java 集合库,它们依赖于提供特定类型集合的事实,而不是像提供的基于对象的实现ArrayList

此外,使用get()访问元素的方法(尽管很小)和调整大小操作的成本是有成本的,这在大量ArrayLists插入和删除操作中可能很重要。当然,数组不会发生这种情况,因为它们本质上具有固定的大小,这既是优势也是劣势。

回答您的问题:如果您事先知道需要的元素数量,并且这些元素不会发生太大变化(插入、删除),那么您最好的选择是使用数组。如果需要一些修改操作并且性能至关重要,请尝试使用 Trove 或 fastutil。

于 2012-04-10T17:07:36.360 回答
0

检索特定字符串,删除特定字符串...我认为 ArrayList 不是最好的解决方案。看看 HashSet 或 LinkedHashSet。

于 2012-04-10T17:07:12.357 回答
0

如果您查看ArrayList 的源代码,您将看到:

  107       /**
  108        * The array buffer into which the elements of the ArrayList are stored.
  109        * The capacity of the ArrayList is the length of this array buffer.
  110        */
  111       private transient Object[] elementData;

它在内部使用数组。

所以 ArrayList 永远不会比使用数组更快。

于 2012-04-10T17:18:14.843 回答
0

如果您最初正确调整 ArrayList 的大小,主要区别将来自添加,它会进行范围检查,您可以使用数组摆脱。但我们在这里谈论的是几个 CPU 周期。

除此之外应该没有明显的区别。例如,indexOfArrayList 中的方法如下所示:

   public int indexOf(Object o) {
       if (o == null) {
           for (int i = 0; i < size; i++)
               if (elementData[i]==null)
                   return i;
       } else {
           for (int i = 0; i < size; i++)
               if (o.equals(elementData[i]))
                   return i;
       }
       return -1;
   }
于 2012-04-10T17:26:10.643 回答