通常的构造函数ArrayList是:
ArrayList<?> list = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
但是还有一个重载的构造函数,其初始容量有一个参数:
ArrayList<?> list = new ArrayList<>(20);
Run Code Online (Sandbox Code Playgroud)
ArrayList当我们可以随意添加时,为什么创建具有初始容量的产品很有用?
在 C 中创建自动扩展数组(如 C++ 的 std::vector)时,通常(或者至少是常见的建议)在每次填充时将数组的大小加倍,以限制调用量,以realloc避免尽可能复制整个数组。
例如。我们首先为 8 个元素分配空间,插入 8 个元素,然后为 16 个元素分配空间,再插入 8 个元素,再分配 32 个元素,等等。
但realloc如果可以扩展现有的内存分配,则不必实际复制数据。例如,以下代码在我的系统上仅执行 1 次复制(初始 NULL 分配,因此它不是真正的副本),即使它调用了realloc10000 次:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int i;
int copies = 0;
void *data = NULL;
void *ndata;
for (i = 0; i < 10000; i++)
{
ndata = realloc(data, i * sizeof(int));
if (data != ndata)
copies++;
data = ndata;
}
printf("%d\n", copies);
}
Run Code Online (Sandbox Code Playgroud)
我意识到这个例子非常临床 - 现实世界的应用程序可能会有更多的内存碎片并且会做更多的副本,但即使我在循环之前进行一堆随机分配realloc,它也只会在 …