当ArrayList调整自身大小时,它添加了多少个元素?

时间:2011-02-01 07:08:05

标签: java arraylist

Java的ArrayList在需要时动态扩展自己。扩展发生时它会添加多少个元素?

它是否将旧数组复制到新数组中,还是以某种方式将两者连接在一起?

3 个答案:

答案 0 :(得分:9)

查看source code

int newCapacity = (oldCapacity * 3)/2 + 1;

确切因素因实现而异,gnu使用因子2.它没关系,它只是为了速度而交换内存。

它将所有元素复制到一个新数组中。

答案 1 :(得分:4)

它会创建一个新的 double 数组,其大小为多个,并复制元素。 (我不确定是否按照Java标准指定了实际的乘数。)

现在自然而然的问题是,为什么?为什么不每次只添加五个元素?

让事情更快:你免费添加 n 元素,在元素 n + 1上,你必须复制 n 以前的元素到大小 2n 的数组中。因此,复制那些 n 元素的成本会自行分配(“摊销”)(因为您以前免费添加它们),平均来说,添加每个元素的成本是 n / n ,或每个元素约1次操作。

(有关此主题的更多讨论,请参阅this link。)

答案 2 :(得分:0)

严格来说,确切的大小调整行为是not specified in the spec/JavaDoc

  

除了添加元素具有不变的摊余时间成本这一事实之外,未指定增长政策的详细信息。

这意味着内部数组不能通过添加常数来调整大小,但必须涉及一些乘法。正如maartinus所指出的那样,Sun JDK和OpenJDK的大小乘以1.5(大致)。