List的底层实现原理?如何实现扩容?删除时占用内存空间会释放吗?
在C#中,List 是一个动态数组,其底层实现原理是基于数组。当 List 的容量不足以容纳新元素时,它会自动扩容。以下是关于 List 底层实现的一些详细信息:
- 初始容量
当你创建一个新的List实例时,默认情况下它的初始容量为0。首次添加元素时,容量会被设置为默认值4。 - 扩容机制
- 自动扩容: 当你向
List中添加元素,并且当前容量已满时,List会自动扩容。 - 扩容策略: 每次扩容时,新的容量通常是旧容量的两倍(具体取决于.NET版本和配置)。这种增长方式可以减少频繁重新分配内存带来的性能开销。
- 数据复制: 在扩容过程中,现有元素会被复制到新的、更大的数组中。
- 删除操作
- 删除元素: 使用
Remove或RemoveAt方法可以从列表中删除元素。 - 内存释放: 删除元素后,
List不会立即释放被删除元素所占用的空间。这是因为后续可能还会继续添加元素,保持较大的容量有助于提高性能。 - TrimExcess: 如果你想手动释放多余的容量,可以调用
TrimExcess方法。这将使List的容量缩小至实际元素数量,从而释放多余的空间。
下面是一个简单的示例代码,展示了如何使用List并观察其扩容行为:
[]
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List numbers = new List();
Console.WriteLine($"Initial Capacity: {numbers.Capacity}");
for (int i = 0; i < 15; i++)
{
numbers.Add(i);
Console.WriteLine($"Added element {i}, Current Capacity: {numbers.Capacity}");
}
// Remove an element and check capacity
numbers.RemoveAt(0);
Console.WriteLine($"After removing one element, Current Capacity: {numbers.Capacity}");
// Trim excess capacity
numbers.TrimExcess();
Console.WriteLine($"After trimming excess capacity, Current Capacity: {numbers.Capacity}");
}
}
在这个示例中,你可以看到 List 如何随着元素的添加而自动扩容,并且通过 TrimExcess 方法来释放多余的容量。

浙公网安备 33010602011771号