java为什么trimToSize/ensureCapacity方法提供“公共”级访问?
任何想要访问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
提供的抽象
# 1 楼答案
在某些情况下,效率可能比数据抽象成本更高。当您准备添加已知数量的元素时,
ensureCapacity
可以用来预先分配内部缓冲区一次。当您不打算添加更多元素来释放浪费的内存时,可以使用trimToSize
。这两种方法都不适用于其他List
实现,因此它们仅添加到ArrayList
请注意,列表通常是由一个知道使用什么实现的方法创建和初始填充的。所以这并没有打破抽象。例如,考虑这样的代码:
通过这种方式,您可以节省内存,并且仍然返回
List
间隔# 2 楼答案
这里没有任何东西会破坏
List
的合同ArrayList
是List
的一个特定实现,如果您的程序有特定的性能需求,这些需求对您来说非常重要,您可以放弃使用List
的抽象,那么没有理由不允许您使用特定的方法来调整ArrayList
的行为