【发布时间】:2018-11-10 06:39:37
【问题描述】:
我有一个问题,关于 ArrayList 的容量增长(不是大小,而是容量)在 Java 中是如何管理的。 当我们使用默认构造函数初始化一个ArrayList而不设置容量时,默认设置容量=10。
此时,当我们向列表中添加另一个元素时,Oracle 文档说“随着元素被添加到 ArrayList,它的容量会自动增长。除了添加一个元素具有恒定的摊销时间成本。”
如果我们看一下 Java 内部,容量增长策略已经改变了它的功能。在 Java 6 之前它是:
(1) int newCapacity = (oldCapacity * 3)/2 + 1;
从 Java 7(和 > 7)开始:
(2) int newCapacity = oldCapacity + (oldCapacity >> 1);
但这两个数学系列略有不同。从默认值 (10) 开始,我们有:
(1) 10,16,25,38,58,88,133,200,301,452...
(2) 10,15,22,33,49,73,109,163,244,366...
我认为这对 ArrayList 的使用没有任何影响,但是他们为什么要更改此功能?有任何性能原因吗?他们是否在旧版本中发现了缺陷或错误?
【问题讨论】: