C#面试题更新 2026-08-05

在 C# 编程中,List<T> 类型提供的 Capacity 属性有哪些具体用途?请结合其默认值、动态扩容机制以及它与 Count 属性的区别,说明该属性的实际应用场景与潜在影响。

性能优化技术原理C#

考察说明

考查对 C# List<T> 内部存储机制的理解,包括 Capacity 与 Count 的区别、动态扩容逻辑及其对性能的影响。

回答思路

  1. 【回答框架 1】Capacity 表示 List<T> 在不重新分配内部数组的情况下所能容纳的元素总数,而 Count 表示当前实际存储的元素个数。Capacity 总是大于或等于 Count。
  2. 【回答框架 2】默认情况下,List<T> 的初始 Capacity 为 0,添加第一个元素时扩容为 4,之后按需倍增(如 4, 8, 16),扩容时需复制原有元素到新数组,时间复杂度为 O(n),因此频繁扩容会影响性能。
  3. 【回答框架 3】使用 Capacity 属性可以预先设置容量,避免添加大量元素时的多次扩容,从而减少内存分配和复制次数,提升性能。例如,已知需要存储 10000 个元素时,可提前设置 Capacity 为 10000。
  4. 【回答框架 4】Capacity 与 Count 不同,Capacity 是容量,Count 是元素数量。将 Capacity 设置为小于 Count 的值会抛出 ArgumentOutOfRangeException。此外,Capacity 不会自动收缩,但可通过调用 TrimExcess 方法释放多余容量。
  5. 【回答框架 5】实际应用中,应权衡内存占用与扩容开销。若元素数量不确定但范围可预估,设置合理容量可优化性能;反之,过度设置 Capacity 可能浪费内存,应根据实际数据规模和内存限制权衡。
  6. 【关键点 1】Capacity 是 List<T> 的容量,Count 是实际元素数,Capacity 始终 >= Count。
  7. 【关键点 2】List<T> 默认初始容量为 0,按需以倍增方式扩容,扩容涉及数组复制,时间开销为 O(n)。
  8. 【关键点 3】通过 Capacity 属性可预先分配容量,减少扩容次数,提升大量元素添加时的性能。
  9. 【关键点 4】设置 Capacity 小于 Count 会异常,TrimExcess 可收缩容量以节省内存,但可能再次触发扩容。
  10. 【易错点 1】误以为 Capacity 与 Count 相同,导致逻辑错误。
  11. 【易错点 2】频繁添加元素时未预留容量,导致多次扩容影响性能。
  12. 【易错点 3】设置过大 Capacity 造成内存浪费,且不自动释放,需注意调用 TrimExcess 控制内存。