Java的ArrayList在需要时动态扩展自己。扩展发生时它会添加多少个元素?
它是否将旧数组复制到新数组中,还是以某种方式将两者连接在一起?
答案 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(大致)。