【问题标题】:Why trimToSize/ensureCapacity methods provide 'public' level access?为什么 trimToSize/ensureCapacity 方法提供“公共”级别的访问权限?
【发布时间】:2015-10-25 03:11:18
【问题描述】:

任何想要访问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提供的抽象?

【问题讨论】:

  • 这些方法是附加功能。我认为他们没有违反java.util.List 中的任何合同,因为所有这些功能也(大概)正确实现了。您认为他们以何种方式违约?
  • java.util.List 提供的抽象是如何被这些ArrayList 方法“破坏”的?这有点像说狗“打破了'哺乳动物'的抽象概念”,因为它们可以吠叫,而吠叫不是“哺乳动物”抽象概念的一部分。
  • 所以你是说子类永远不能用公共方法扩展它们的超类的接口?
  • @TedHopp 这里的抽象将接口(@98​​7654335@)与实现(ArrayList/LinkedList)分开。此抽象的目的是仅通过接口(@98​​7654338@)访问列表工具。我说的对吗?

标签: java arraylist collections abstraction


【解决方案1】:

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

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

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

这样你可以节省内存并且仍然返回List接口。

【讨论】:

    【解决方案2】:

    这里没有任何内容违反List 的合同。 ArrayListList 的特定实现,如果您的程序有特定的性能需求,这些需求对您来说非常重要,以至于您可以放弃使用 List 的抽象,那么没有理由不允许您使用特定的方法进行调优ArrayList 的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2017-09-20
      • 2012-07-24
      • 2012-12-26
      相关资源
      最近更新 更多