任何想要访问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
提供的抽象?
答案 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
的合同。 ArrayList
是List
的具体实现,如果您的程序具有足够重要的特定性能需求,您可以放弃使用List
的抽象,则没有理由不允许您使用特定方法来调整ArrayList
的行为。