参考文章:深刻理解C#中数组,ArrayList,List之间的区别 - 知乎 (zhihu.com)
C#:List与数组区别,什么时候用哪个_c#数组首地址_四夕立羽的博客-CSDN博客
数组
数组是引用类型,它的声明,只是为其引用预留空间,随后使用new运算符创建实例,将数组元素赋值为默认值。因为数组元素的地址在内存中是连续的,所以它的访问速度是非常快的,而且修改元素数值也很方便,但有利也有弊,这也导致了数组进行复杂操作时捉襟见肘,比如插入和删除中间元素,这需要对大部分元素进行位置移动。
在C#中,数组分为矩形数组和交错数组,它们都是多维的,在某些时候可以更好的管理数据。
在数组创建阶段,需要手动指明数组的长度,这就会很被动,需要我们提前知道数据的长度,如果数组长度过长,这会导致内存的大大浪费,而数组长度过短的话,又会导致数据溢出,报错,这给数组的使用戴上了枷锁。
列表
列表是一个提前封装好的泛型类,它可以安全地接受各种类型的数据。它的内部其实维护着一个泛型数组,因为提前封装好了各种操作方法,这导致列表在元素插入、删除方面更方便,在进行复杂操作时,列表无疑是一个更好的选择。
列表内部的数组是一个一维数组,这也在一定程度上限制了列表的使用,不过列表在创建时不需要指定长度,因为它可以使用内置方法对自身长度进行扩容。
同时其内存分配方式也是不合理的,当增加元素需要对数组进行2的指数扩充时,原数组会被抛弃,且当元素数量为520时,剩余的504个元素会造成大部分内存空间的浪费,这会给GC带来很大的压力,
总结
数组适合对已知长度的数据进行存放、读取和修改,列表适合充当数据库,随时进行数量不定的数据的增删查改。列表只是一个兼容性比较强的组件,使用效率并不高。