为什么“列表容量”的大小要比需要的大得多

本文关键字:列表容量 为什么 列表 容量 | 更新日期: 2023-09-27 18:20:58

我试图用0到20000范围内的10000个随机整数来填充一个列表。这是我如何做到的代码:

List<int> rand_num = new List<int>();
        Random rand = new Random();
        int i =0;
        //int counter = 0;
        while (i < 10000)
        {
            rand_num.Add(rand.Next(0, 20000));
            i++;
        }
        textBox1.Text = rand_num.Capacity.ToString();

问题是,当它到达textBox1.Text = rand_num.Capacity.ToString();行时,输出为16384。我只输入了10000个数字,如何将其重新调整为6384,超出我的需要?我是否遗漏了一些关于列表在c#中的行为的内容?

为什么“列表容量”的大小要比需要的大得多

在内部,List<T>类将其项存储在一个数组中。因为数组是固定大小的,所以添加新项的成本非常高,因为它需要分配一个新数组并将以前的所有项复制到新数组中。为了解决这个问题,List<T>类使其数组呈指数级增长,只有当项目数量超过其内部数组的容量时,其大小才会翻倍。

换句话说,Capacity不是指列表中的项目数。它指的是列表可以存储的项目数,而不必重新分配其内部数组。还要注意的是,您提前知道需要在数组中存储大约多少项,可以在列表的构造函数中指定初始容量,以避免大量昂贵的重新分配(默认值为4)。

使用Count属性可以随时获取列表中的项目数。

Capacity是列表在需要内部调整大小之前可以容纳的大小。

Capacity始终大于或等于Count。如果计数超过容量在添加元素的同时,容量增加了在复制旧数组之前自动重新分配内部数组元素并添加新元素。

您要查找的是Count,它返回列表中当前的元素数量。

textBox1.Text = rand_num.Count.ToString();

当元素的数量需要超过容量时,.NET会调整内部数组的大小,以便它可以容纳更多的值,这通常是一项昂贵的操作。如果您事先知道所需的最大值,也可以设置Capacity属性。

您应该使用:

textBox1.Text = rand_num.Count.ToString();