ListCapacityReturnsMoreItemsThanAdded存在)。与仅具有长度数组相比,这非常令人困惑。我正在使用List.Capacity但它会产生意想不到的结果:Listfruits=newList();fruits.Add("苹果");fruits.Add("橙色");fruits.Add("香蕉");fruits.Add("樱桃");fruits.Add("芒果");Console.WriteLine("List中有{0}个项目。",fruits.Capacity);当我运行它时,控制台显示:列表中有4个项目。我不明白为什么当我只添加5个项目时它显示容量为8。列表的容量表示列表当前为当前对象和添加到其中的对象预留的内存量。列表的计数是实际添加到列表中的项目数。下面是来自MSDN的Capacity属性的完整描述:Capacity是List在需要调整大小之前可以存储的元素数,Count是List中实际的元素数。容量始终大于或等于计数。如果在添加元素时Count超出容量,则在复制旧元素和添加新元素之前通过自动重新分配内部数组来增加容量。可以通过调用TrimExcess()方法或通过显式设置Capacity属性来减少容量。当显式设置Capacity的值时,内部数组也会重新分配以容纳指定的容量,并复制所有元素。检索此属性的值是一个O(1)操作;设置属性是一个O(n)操作,其中n是新容量。要添加到其他答案,列表在一个接一个地添加项目时的默认行为是从容量4开始,当列表变满时将其加倍。这就解释了8的容量。为了理解它为什么更大,你需要了解List内部是如何工作的。在内部,List使用数组(因此T[])来存储其内容。这个数组以4个元素的大小开始,相当于说T[]array=newT[4]。当您将项目添加到列表时,它存储在一个数组中:数组[0]中的第一个项目,数组[1]中的第二个项目,等等。但是,第五个项目不适合此数组,因为它只有四个元素长的。并且由于数组的长度在创建后无法更改,唯一的选择是获取数组的内容并将其移动到一个足够大的新数组以容纳第五项。List的实现选择在每次用完空间时将数组缓冲区的大小加倍,因此为了容纳第五项,它将数组容量加倍为8。然后是16,依此类推。为什么它选择加倍可能有很好的数学支持,并且它可能是昂贵的复制操作(不想不断分配新缓冲区)和浪费空间之间的一个很好的折衷。通过加倍,内存浪费永远不会超过50%,我相信需要分配新数组的次数呈对数减少。容量与列表的项目数不同。默认情况下,所有语言中实现良好的列表容器都会分配比保存当前条目数所需更多的内存。这是因为每次添加内存时分配更大的内存块比为另一个项目分配内存更有效。以上是C#学习教程:列表容量返回的项多于添加的项。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
