将ArrayList缩小为新大小

rip*_*234 61 java arraylist

我真的需要自己实施吗?

private void shrinkListTo(ArrayList<Result> list, int newSize) {
  for (int i = list.size() - 1; i >= newSize; --i)
  list.remove(i);
}
Run Code Online (Sandbox Code Playgroud)

mP.*_*mP. 116

创建一个子列表,其中包含您要删除的元素范围,然后调用clear返回的列表.

list.subList(23, 45).clear()
Run Code Online (Sandbox Code Playgroud)

这种方法在ListArrayList的文档中被称为习语.


这是一个完全经过单元测试的代码示例!

// limit yourHappyList to ten items
int k = yourHappyList.size();
if ( k > 10 )
    yourHappyList.subList(10, k).clear();
    // sic k, not k-1
Run Code Online (Sandbox Code Playgroud)


dfa*_*dfa 7

或者你可以使用subList方法:

public static <T> List<T> shrinkTo(List<T> list, int newSize) {
    return list.subList(0, newSize - 1);
}
Run Code Online (Sandbox Code Playgroud)

  • @dfa不,GC不能删除原始列表,至少在ArrayList的情况下(这是迄今为止最常见的情况),如果查看源代码(对于ArrayList),您会看到` list.sublist()返回一个恰好具有对原始列表的引用的SubList对象,因此GC无法声明原始列表。也许如果您编辑答案以返回`new ArrayList(list.subList(0,newSize-1))`,那么我们将摆脱对原始列表的引用 (3认同)

dfa*_*dfa 5

使用ArrayList #removeRange()方法:

protected void removeRange(int fromIndex,int toIndex)

从此列表中删除索引介于fromIndex(包含)和toIndex(独占)之间的所有元素.将任何后续元素向左移动(降低其索引).此调用通过(toIndex - fromIndex)元素缩短列表.(如果toIndex == fromIndex,此操作无效.)

然后使用ArrayList#trimToSize()方法:

将此ArrayList实例的容量调整为列表的当前大小.应用程序可以使用此操作来最小化ArrayList实例的存储.