我有一个现有的ArrayList
,将根据特定条件进行过滤。我正在使用Apache的CollectionUtils.select(Collection, Predicate, Collection)
进行过滤。
传递给此方法的第二个集合将填充相关对象。现在使用
创建这个新集合更明智List newList = new ArrayList();
或
List newList = new ArrayList(listToBeFiltered.size());
在第一种情况下,如果达到初始容量,List
将升迁,而在第二种情况下,有时会创建过大的List
。
哪种方式更好?如果我在解释中犯了任何错误,请纠正我。
答案 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,如果已满,则大小翻倍。