首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪个更“昂贵”:创建一个太大的ArrayList还是升级一个ArrayList?

哪个更“昂贵”:创建一个太大的ArrayList还是升级一个ArrayList?
EN

Stack Overflow用户
提问于 2012-03-27 18:05:22
回答 4查看 1.9K关注 0票数 3

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

传递给此方法的第二个集合将使用相关对象进行填充。现在创建这个新集合是否更明智?

代码语言:javascript
复制
List newList = new ArrayList();

或使用

代码语言:javascript
复制
List newList = new ArrayList(listToBeFiltered.size());

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-27 18:11:11

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

调整ArrayList的大小,或者通常通过将当前大小加倍并复制内容来完成。因此,对于一个巨大的最终大小,可能需要几个调整大小的操作。

另一方面,非常大的初始大小可能会占用相当多的内存,并可能触发更早的垃圾收集,但列表必须非常大。

您可能会尝试并分析这两个选项,但对于标准大小,我更喜欢指定一个合理的初始大小。

票数 1
EN

Stack Overflow用户

发布于 2012-03-27 18:18:44

如果您对筛选的选择性有任何直觉,那么您可以调整列表的大小,使其略大于其预期大小。如果选择性通常是20%,那么您可以将最终结果设置为(比方说) 25%。

代码语言:javascript
复制
 List newList = new ArrayList((int) (0.25 * listToBeFiltered.size()));
票数 1
EN

Stack Overflow用户

发布于 2012-03-27 18:10:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9887384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档