为什么 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
的合同。 ArrayList
是 List
的特定实现,如果您的程序有特定的性能需求,这些需求非常重要,以至于您放弃使用 List
的抽象,没有理由不允许您使用特定方法调整 ArrayList
的行为。
在某些情况下,效率的成本可能高于数据抽象。当您要添加已知数量的元素时,ensureCapacity
可用于预分配一次内部缓冲区。当您不打算添加更多元素以释放浪费的内存时,可以使用 trimToSize
。这两种方法都不适用于其他 List
实现,因此它们仅添加到 ArrayList
。
请注意,通常列表是通过一种方法创建和初始填充的,该方法知道使用的是什么实现。所以这不会破坏抽象。例如,考虑这样的代码:
public List<String> createList() {
ArrayList<String> list = new ArrayList<>();
// populate the list
list.trimToSize();
return list;
}
这样您可以节省内存,并且仍然 return List
界面。
任何想要访问 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
的合同。 ArrayList
是 List
的特定实现,如果您的程序有特定的性能需求,这些需求非常重要,以至于您放弃使用 List
的抽象,没有理由不允许您使用特定方法调整 ArrayList
的行为。
在某些情况下,效率的成本可能高于数据抽象。当您要添加已知数量的元素时,ensureCapacity
可用于预分配一次内部缓冲区。当您不打算添加更多元素以释放浪费的内存时,可以使用 trimToSize
。这两种方法都不适用于其他 List
实现,因此它们仅添加到 ArrayList
。
请注意,通常列表是通过一种方法创建和初始填充的,该方法知道使用的是什么实现。所以这不会破坏抽象。例如,考虑这样的代码:
public List<String> createList() {
ArrayList<String> list = new ArrayList<>();
// populate the list
list.trimToSize();
return list;
}
这样您可以节省内存,并且仍然 return List
界面。