有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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提供的抽象


共 (2) 个答案

  1. # 1 楼答案

    在某些情况下,效率可能比数据抽象成本更高。当您准备添加已知数量的元素时,ensureCapacity可以用来预先分配内部缓冲区一次。当您不打算添加更多元素来释放浪费的内存时,可以使用trimToSize。这两种方法都不适用于其他List实现,因此它们仅添加到ArrayList

    请注意,列表通常是由一个知道使用什么实现的方法创建和初始填充的。所以这并没有打破抽象。例如,考虑这样的代码:

    public List<String> createList() {
        ArrayList<String> list = new ArrayList<>();
        // populate the list
        list.trimToSize();
        return list;
    }
    

    通过这种方式,您可以节省内存,并且仍然返回List间隔

  2. # 2 楼答案

    这里没有任何东西会破坏List的合同ArrayListList的一个特定实现,如果您的程序有特定的性能需求,这些需求对您来说非常重要,您可以放弃使用List的抽象,那么没有理由不允许您使用特定的方法来调整ArrayList的行为