【发布时间】:2015-12-14 04:25:11
【问题描述】:
我有一个要转换的 ArrayList 这是我的代码:
ArrayList<PostWrapper> postWrapperList = listingWrapper.getData();
int size = postWrapperList.size();
ArrayList<Post> postList = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
PostWrapper postWrapper = postWrapperList.get(i);
if (postWrapper.isKindLink()) {
Post post = postWrapper.getData();
postList.add(post);
}
}
postList.removeAll(Collections.singleton(null));
正如您在这段代码中看到的那样,我正在执行某种过滤,因此最终大小可以小于初始大小。目前我正在调用 removeAll() 来删除空对象以缩小 ArrayList。
我的问题是哪种方式更有效,还是只创建没有任何初始大小的 ArrayList,然后让 ArrayList 类处理动态分配?
我担心释放我在创建列表时保留的多余容量。
【问题讨论】:
-
“缩小”列表是什么意思。您是否期望您添加的某些条目实际上是空的,并且您想删除它们?或者您是否关心释放您在创建列表时保留的多余容量?您不能使用
removeAll()执行后者,因为未使用的容量不被视为列表的一部分。这个问题还不够清楚,无法回答。 -
@JimGarrison 我实际上关心的是释放我在创建列表时保留的多余容量。所以根据你的解释,我不需要做什么?
-
多余的容量只是每个槽的一个引用(4 或 8 个字节,具体取决于指针的大小)。该列表不存储
Post的空实例。除非列表大小在数十万,否则不要担心。如果您真的想这样做,则必须将列表复制到正确容量的新列表中。顺便说一句,这听起来像是过早的优化。 -
你可以使用 postList.trimToSize();将此 ArrayList 实例的容量修剪为列表的当前大小。应用程序可以使用此操作来最小化 ArrayList 实例的存储。
-
正如@WalterM 在他的回答中指出的那样,如果您真的非常需要这样做并且确定您不会再添加任何元素,那么总会有
trimToSize()。但请记住,复制需要花费时间。在你证明你确实需要修剪它之前,我会不理会它。