为什么 trimToSize/ensureCapacity 方法提供 'public' 级别的访问权限?

Why trimToSize/ensureCapacity methods provide 'public' level access?

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

但是可以很容易地打破这种使用契约并访问方法trimToSize

public void trimToSize() { ... }

ensureCapacity

public void ensureCapacity(int minCapacity) { ...}

因为这两个方法既没有被java.util.AbstractList覆盖,也没有被java.util.List实现。

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

这里没有任何内容会破坏 List 的合同。 ArrayListList 的特定实现,如果您的程序有特定的性能需求,这些需求非常重要,以至于您放弃使用 List 的抽象,没有理由不允许您使用特定方法调整 ArrayList 的行为。

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

请注意,通常列表是通过一种方法创建和初始填充的,该方法知道使用的是什么实现。所以这不会破坏抽象。例如,考虑这样的代码:

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

这样您可以节省内存,并且仍然 return List 界面。