【问题标题】:Java - Initializing ArrayList with size then shrinkJava - 用大小初始化 ArrayList 然后缩小
【发布时间】: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()。但请记住,复制需要花费时间。在你证明你确实需要修剪它之前,我会不理会它。

标签: java arraylist


【解决方案1】:

来自 java.util.ArrayList 的代码

/**
 * Trims the capacity of this <tt>ArrayList</tt> instance to be the
 * list's current size.  An application can use this operation to minimize
 * the storage of an <tt>ArrayList</tt> instance.
 */
public void trimToSize() {
   modCount++;
   if (size < elementData.length) {
       elementData = (size == 0)
         ? EMPTY_ELEMENTDATA
         : Arrays.copyOf(elementData, size);
   }
}

【讨论】:

    【解决方案2】:

    如果我正确理解了这个问题,这段代码 sn-p 可能对您使用 Java 8 的新流实用程序有所帮​​助:

    List<Post> postList = postWrapperList.stream()
                              .filter(PostWrapper::isKindLink)
                              .map(PostWrapper::getData)
                              .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2012-02-12
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      相关资源
      最近更新 更多