为什么ArrayList没有capacity()方法,但是hasCapacity(int),而Vector,StringBuffer,StringBuilder都有?

时间:2017-05-09 11:28:24

标签: java arraylist capacity

为了记住JCF类方法,我总是试图找到一些记忆通过理解的逻辑。

除了List接口方法, ArrayList类有capacity()方法,但没有ensureCapacity(int)方法。 Vector,StringBuffer,StringBuilder同时具有。

可能存在以下逻辑:如果我们还有ensureCapacity(int)方法,则总是存在 capacity()方法,因为它允许在运行时更改容量(也覆盖给予构造函数的容量),所以我们可能对目前设定的容量感兴趣。

但ArrayList打破了这个逻辑:它有capacity(),但没有ensureCapacity(int)。虽然几乎所有其他带有capacity()(Vector,StringBuffer,StringBuilder)的类都有。

ArrayList背后是否有任何逻辑/实际原因除了上述(助记符)"规则",或者它只是一个历史/兼容性怪癖?

P.S。 this与我的问题有关。它指出,HashMap可能有像ArrayList一样的ensureCapacity(int),但它没有它,因为设计师认为它很少需要。

1 个答案:

答案 0 :(得分:0)

为什么ArrayList没有容量()

Java中的

ArrayList 是一个数组和 List 之间的交叉 - 因此它的命名方式就是它的原因。 JavaDoc here表示它是

  

[r] List接口的esizable-array实现

因此,它没有任何容量,这意味着它可以容纳最大数量。相反,它只是在任何给定时间中有许多项目,由

给出
ArrayList.size()

ensureCapacity(int)方法只是一个辅助方法,可用于确保实例至少具有 x 个元素数 - 与检查<相同strong> size()&gt; X

思考关系

你提到了类 ArrayList,Vector,StringBuffer StringBuilder 。你在谈论两种不同类型的对象,这里有两种:集合,两种是字符序列 ArrayList Vector 都扩展 AbstractList ,而 StringBuffer StringBuilder 不扩展任何事情(除了对象),而是实现 CharacterSequence 。这两个父母有一些共同的方法名称是你选择类的巧合,但在命名方面是有意的 - 这些方法在这些类中具有相同的行为。

您不应该认为 ArrayList StringBuffer Vector StringBuilder 相关,因为它们不是 - 它们是完全不同的继承树。