Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么trimToSize/ensureCapacity方法提供“公共”级访问?_Java_Arraylist_Collections_Abstraction - Fatal编程技术网

Java 为什么trimToSize/ensureCapacity方法提供“公共”级访问?

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.ArrayList工具的用户都必须遵守java.util.List中提供的使用合同

但是你可以很容易地打破这种使用契约,访问trimToSize方法

和保证能力

因为这两个方法既不是从java.util.AbstractList重写的,也不是从java.util.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;
}