为什么trimToSize/ensureCapacity方法提供"公共"级访问?

ove*_*nge 1 java collections abstraction arraylist

任何想要访问java.util.ArrayList设施的用户都必须遵守提供的使用合同java.util.List.

但是人们可以轻松地破坏这个使用合同并访问这些方法 trimToSize

public void trimToSize() { ... }
Run Code Online (Sandbox Code Playgroud)

ensureCapacity

public void ensureCapacity(int minCapacity) { ...}
Run Code Online (Sandbox Code Playgroud)

因为这两种方法既不会被覆盖java.util.AbstractList也不会被实现java.util.List.

那么,为什么这两个方法提供了public级别访问并打破了提供的抽象java.util.List

Tag*_*eev 6

在某些情况下,效率可能比数据抽象成本更高.在ensureCapacity可被用于一次预分配内部缓冲器时您将要添加的元素的已知数量.trimToSize当您不打算添加更多元素以释放浪费的内存时,可以使用它.这两种方法都不适用于其他List实现,因此仅添加它们ArrayList.

请注意,通常会创建列表,并且最初由一个知道实际使用的实现的方法填充.所以这并没有打破抽象.例如,考虑这样的代码:

public List<String> createList() {
    ArrayList<String> list = new ArrayList<>();
    // populate the list
    list.trimToSize();
    return list;
}
Run Code Online (Sandbox Code Playgroud)

这样你可以保存内存并仍然返回Listinterace.