我有一个现有的ArrayList,它将根据特定的标准进行过滤。我正在使用Apache的CollectionUtils.select(Collection, Predicate, Collection)进行过滤。
传递给此方法的第二个集合将使用相关对象进行填充。现在创建这个新集合是否更明智?
List newList = new ArrayList();或使用
List newList = new ArrayList(listToBeFiltered.size());在第一种情况下,如果达到初始容量,List将被放大,而在第二种情况下,有时会创建过大的List。
哪种方式更好?如果我的解释中有任何错误,请纠正我。
发布于 2012-03-27 18:11:11
这通常取决于最终大小和要过滤的集合的大小。
调整ArrayList的大小,或者通常通过将当前大小加倍并复制内容来完成。因此,对于一个巨大的最终大小,可能需要几个调整大小的操作。
另一方面,非常大的初始大小可能会占用相当多的内存,并可能触发更早的垃圾收集,但列表必须非常大。
您可能会尝试并分析这两个选项,但对于标准大小,我更喜欢指定一个合理的初始大小。
发布于 2012-03-27 18:18:44
如果您对筛选的选择性有任何直觉,那么您可以调整列表的大小,使其略大于其预期大小。如果选择性通常是20%,那么您可以将最终结果设置为(比方说) 25%。
List newList = new ArrayList((int) (0.25 * listToBeFiltered.size()));发布于 2012-03-27 18:10:00
在大多数情况下,“升级”的成本会更高,因为每次需要腾出更多空间时,它都会受到惩罚。对于添加大量条目,这将导致执行过程中的微小延迟。假设您以后不添加更多的项目,那么在开始时分配一个较大的大小只会导致一次惩罚。但是,请注意,动态数组/列表/容器通常具有在它们必须重新分配内存之前提供合理容量的粒度,因此对于少数项,您可能看不出任何差异。
https://stackoverflow.com/questions/9887384
复制相似问题