List的底层实现原理?如何实现扩容?删除时占用内存空间会释放吗?

在C#中,List 是一个动态数组,其底层实现原理是基于数组。当 List 的容量不足以容纳新元素时,它会自动扩容。以下是关于 List 底层实现的一些详细信息:

  1. 初始容量
    当你创建一个新的 List 实例时,默认情况下它的初始容量为0。首次添加元素时,容量会被设置为默认值4。
  2. 扩容机制
  • 自动扩容: 当你向 List 中添加元素,并且当前容量已满时,List 会自动扩容。
  • 扩容策略: 每次扩容时,新的容量通常是旧容量的两倍(具体取决于.NET版本和配置)。这种增长方式可以减少频繁重新分配内存带来的性能开销。
  • 数据复制: 在扩容过程中,现有元素会被复制到新的、更大的数组中。
  1. 删除操作
  • 删除元素: 使用 RemoveRemoveAt 方法可以从列表中删除元素。
  • 内存释放: 删除元素后,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 方法来释放多余的容量。

posted @ 2026-02-03 16:34  蓝天下e_e  阅读(4)  评论(0)    收藏  举报