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

请解释 C# 编程语言中,List<T> 与数组在内存分配、容量扩展和访问方式上的关键不同点,并讨论在实际项目中如何根据不同场景做出选择,比如什么时候优先考虑使用 List<T>?

技术原理技术选型方案权衡C#

考察说明

考查对 C# 中 List<T> 与数组底层机制差异的理解,以及根据业务场景选择合适数据结构的能力。

回答思路

  1. 【回答框架 1】数组在 C# 中是一种固定大小的连续内存块,一旦创建,其长度不可变;List<T> 是动态数组,内部由数组实现,但支持自动扩容。数组通过索引访问元素,时间复杂度为 O(1),List<T> 的索引访问同样是 O(1)。
  2. 【回答框架 2】List<T> 在添加元素时,如果内部数组容量不足,会分配一个新的更大数组(通常是当前容量的两倍),并将原元素复制过去,因此添加操作可能触发 O(n) 的复制成本,数组则直接分配固定大小,没有扩容开销。
  3. 【回答框架 3】选择依据:当元素数量固定或对性能(尤其是内存和迭代速度)要求极高时,优先使用数组;当元素数量动态增长、需要频繁添加或删除(尤其末尾)时,使用 List<T>。List<T> 还提供了更多的功能,如插入、删除、查找等扩展方法。
  4. 【回答框架 4】内存方面:数组占用的内存是固定的,List<T> 可能因扩容预留多余空间,导致内存浪费。在性能敏感场景,应关注这一点。此外,List<T> 是泛型,避免装箱拆箱,但数组同样可以用于值类型。
  5. 【回答框架 5】在项目实践中,应结合具体需求:若数据规模已知且变化小,数组更高效;若数据规模不定,需要频繁增删,List<T> 更灵活。还需考虑 LINQ 操作、多线程访问等因素。
  6. 【关键点 1】数组长度固定,List<T> 动态扩容。
  7. 【关键点 2】List<T> 内部基于数组实现,扩容时复制元素导致 O(n) 成本。
  8. 【关键点 3】固定数据量优先数组,动态增长优先 List<T>。
  9. 【关键点 4】两者索引访问均为 O(1),但数组内存更紧凑。
  10. 【关键点 5】List<T> 提供更丰富的集合操作。
  11. 【易错点 1】误以为 List<T> 的 Add 操作总是 O(1),实际扩容时是 O(n)。
  12. 【易错点 2】忽略数组与 List<T> 在内存布局上的差异,在多维数组或大规模数据下可能影响性能。
  13. 【易错点 3】在需要频繁在中间位置插入时,应综合考虑使用链表等结构,而不是仅依赖 List。