Java 为什么trimToSize/ensureCapacity方法提供“公共”级访问?
任何想要访问java.util.ArrayList工具的用户都必须遵守java.util.List中提供的使用合同 但是你可以很容易地打破这种使用契约,访问trimToSize方法 和保证能力 因为这两个方法既不是从java.util.AbstractList重写的,也不是从java.util.List实现的Java 为什么trimToSize/ensureCapacity方法提供“公共”级访问?,java,arraylist,collections,abstraction,Java,Arraylist,Collections,Abstraction,任何想要访问java.util.ArrayList工具的用户都必须遵守java.util.List中提供的使用合同 但是你可以很容易地打破这种使用契约,访问trimToSize方法 和保证能力 因为这两个方法既不是从java.util.AbstractList重写的,也不是从java.util.List实现的 那么,为什么这两种方法提供公共级访问并打破java.util.List提供的抽象?这里没有任何东西会打破List的契约。ArrayList是List的一个特定实现,如果您的程序有特定的性能
那么,为什么这两种方法提供公共级访问并打破java.util.List提供的抽象?这里没有任何东西会打破List的契约。ArrayList是List的一个特定实现,如果您的程序有特定的性能需求,这些需求对您来说非常重要,您可以放弃使用List的抽象,那么没有理由不允许您使用特定的方法来优化ArrayList的行为。这里没有任何东西可以打破List的约定。ArrayList是List的一个特定实现,如果您的程序有特定的性能需求,这些需求非常重要,您可以放弃使用List的抽象,那么没有理由不允许您使用特定的方法来优化ArrayList的行为。在某些情况下,效率可能比数据抽象更高。当您准备添加已知数量的元素时,可以使用ensureCapacity预先分配内部缓冲区一次。当您不打算添加更多元素以释放浪费的内存时,可以使用trimToSize。这两种方法都不适用于其他列表实现,因此它们仅添加到ArrayList 注意,列表通常是由一个知道使用什么实现的方法创建和初始填充的。所以这并没有打破抽象。例如,考虑这样的代码:
public List<String> createList() {
ArrayList<String> list = new ArrayList<>();
// populate the list
list.trimToSize();
return list;
}
通过这种方式,您可以节省内存,并且仍然返回列表间隔。在某些情况下,效率可能比数据抽象成本更高。当您准备添加已知数量的元素时,可以使用ensureCapacity预先分配内部缓冲区一次。当您不打算添加更多元素以释放浪费的内存时,可以使用trimToSize。这两种方法都不适用于其他列表实现,因此它们仅添加到ArrayList 注意,列表通常是由一个知道使用什么实现的方法创建和初始填充的。所以这并没有打破抽象。例如,考虑这样的代码:
public List<String> createList() {
ArrayList<String> list = new ArrayList<>();
// populate the list
list.trimToSize();
return list;
}
通过这种方式,您可以节省内存,并且仍然返回列表间隔。这些方法是附加功能。我不认为它们破坏了java.util.List中的任何契约,因为所有这些功能也可能得到了正确的实现。您认为它们以何种方式打破了契约?这些ArrayList方法以何种方式打破了java.util.List提供的抽象?这有点像说狗打破了“哺乳动物”的抽象概念,因为它们会吠叫,虽然吠叫不是抽象哺乳动物的一部分。那么你是说子类永远不能用公共方法扩展其超类的接口?@TedHopp这里的抽象将interfaceList与implementationArrayList/LinkedList分开。此抽象的目的是仅通过interfaceList访问列表工具。我说的对吗?这些方法是附加功能。我不认为它们破坏了java.util.List中的任何契约,因为所有这些功能也可能得到了正确的实现。您认为它们以何种方式打破了契约?这些ArrayList方法以何种方式打破了java.util.List提供的抽象?这有点像说狗打破了“哺乳动物”的抽象概念,因为它们会吠叫,虽然吠叫不是抽象哺乳动物的一部分。那么你是说子类永远不能用公共方法扩展其超类的接口?@TedHopp这里的抽象将interfaceList与implementationArrayList/LinkedList分开。此抽象的目的是仅通过interfaceList访问列表工具。我说得对吗?
public List<String> createList() {
ArrayList<String> list = new ArrayList<>();
// populate the list
list.trimToSize();
return list;
}