当我们使用默认构造函数初始化一个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的使用没有任何影响,但他们为什么要更改这个函数呢?是否有性能原因?他们是否在旧函数中发现了缺陷或错误?