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

时间:2015-08-03 05:34:41

标签: java arraylist collections abstraction

任何想要访问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提供的抽象?

2 个答案:

答案 0 :(得分:6)

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

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

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

这样您就可以保存内存并仍然返回List interace。

答案 1 :(得分:2)

此处没有任何内容违反List的合同。 ArrayListList的具体实现,如果您的程序具有足够重要的特定性能需求,您可以放弃使用List的抽象,则没有理由不允许您使用特定方法来调整ArrayList的行为。