什么更“昂贵”:创建一个太大的ArrayList或升级一个ArrayList?

时间:2012-03-27 10:05:22

标签: java performance collections arraylist

我有一个现有的ArrayList,将根据特定条件进行过滤。我正在使用Apache的CollectionUtils.select(Collection, Predicate, Collection)进行过滤。

传递给此方法的第二个集合将填充相关对象。现在使用

创建这个新集合更明智
List newList = new ArrayList();

List newList = new ArrayList(listToBeFiltered.size());

在第一种情况下,如果达到初始容量,List将升迁,而在第二种情况下,有时会创建过大的List

哪种方式更好?如果我在解释中犯了任何错误,请纠正我。

4 个答案:

答案 0 :(得分:1)

这通常取决于要过滤的集合的最终大小和大小。

调整ArrayList或通常通过将当前大小加倍并复制内容来完成。因此,如果最终大小很大,可能需要进行几次调整大小操作。

另一方面,一个非常大的初始大小可能会占用大量内存并可能触发垃圾收集器,但列表必须真正大。

您可以尝试对两种选项进行分析,但对于标准尺寸,我更倾向于指定合理的初始尺寸。

答案 1 :(得分:1)

如果您对过滤的选择性有任何直觉,那么您可以将列表的大小设置为略大于其预期大小。如果选择性通常为20%,那么您可以将最终结果设置为(例如)25%。

 List newList = new ArrayList((int) (0.25 * listToBeFiltered.size()));

答案 2 :(得分:0)

在大多数情况下,“升级”会更加昂贵,因为每次需要腾出更多空间时都会受到惩罚。对于添加大量条目,这将导致执行期间的微小延迟。假设您以后不添加更多项目,分配大型开始只会产生一次罚款。但请注意,动态数组/列表/容器通常具有在必须重新分配内存之前提供合理容量的粒度,因此对于少量项目,您可能不会发现任何差异。

答案 3 :(得分:0)

取决于你,你有可能在两者上浪费一些空间。

但是直觉如果你认为结果数组会比输入小得多,我建议你使用List newList = new ArrayList();

Arraylist的初始容量为10,如果已满,则大小翻倍。