从性能的角度来看哪个更好..阵列或阵列?

时间:2012-04-10 17:00:30

标签: java arrays collections

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

7 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

如果你的要求没有错误,而且你必须只选择一个arraylist和一个原始数组,我会建议一个arraylist,因为你有所有的API来操纵你自己必须写的数据对于String的原始数组。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

数组总是具有比ArrayList更好的性能。在某种程度上,因为在使用数组时,您不必支付类型转换元素的额外成本(使用泛型并不意味着类型转换消失,只是它们在普通视图中隐藏)。

说实话:Trovefastutil是一些非常快速的Java集合库,它们依赖于提供特定于类型的集合而不是基于对象的实现,例如{{1确实。

此外,使用ArrayList方法访问元素(虽然很小)和调整操作大小的成本是有代价的,这对于具有许多插入和删除的巨大get()来说非常重要。当然,阵列不会发生这种情况,因为它们本身具有固定的大小,这既是优点也是缺点。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果您查看source code of 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永远不会比使用数组更快。

答案 6 :(得分:0)

如果你正确地确定了ArrayList的大小,那么主要区别将来自添加,它会进行一个范围检查,你可以用数组去除它。但我们在这里谈论几个CPU周期。

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

   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;
   }