【发布时间】:2011-01-29 09:48:27
【问题描述】:
当我学习 Java 时,有人告诉我 arraylist 是这样工作的:
它创建一个可容纳 10 个元素的数组。
当添加第 11 个元素时,它会创建一个新列表,其中包含 20 个元素的空间,并将 10 个元素复制到新数组中。这将重复直到没有更多元素要添加,或者达到最大尺寸。
.NET 中的 List 的构造方式是否相同?
【问题讨论】:
当我学习 Java 时,有人告诉我 arraylist 是这样工作的:
它创建一个可容纳 10 个元素的数组。
当添加第 11 个元素时,它会创建一个新列表,其中包含 20 个元素的空间,并将 10 个元素复制到新数组中。这将重复直到没有更多元素要添加,或者达到最大尺寸。
.NET 中的 List 的构造方式是否相同?
【问题讨论】:
您可以通过查询列表的Capacity 轻松测试这一点:
var a = new List<string>();
Console.WriteLine(a.Capacity); // Writes 0
a.Add("abc");
Console.WriteLine(a.Capacity); // Writes 4
a.Add("abc");
a.Add("abc");
a.Add("abc");
a.Add("abc");
Console.WriteLine(a.Capacity); // Writes 8
所以它在实例化时根本不分配任何空间,而是在第一个添加项目时。从 8 增长到 16、32 等等......
【讨论】:
每次当前数组被填满时,泛型 List 类型的内部数组长度都会加倍。
【讨论】:
细节有些不同(就默认元素数量和扩展方式而言),但本质上是相同的。
【讨论】:
我相信这就是它的工作原理,是的。目前我找不到任何文档可以告诉您他们使用的确切算法,但肯定有Capacity(“内部”数组的大小)和Count(您的实际元素数量)的概念已添加)。
【讨论】: