数组与列表 <T> :什么时候使用哪个?

浪尽此生 提交于 2020-01-08 20:43:25

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

MyClass[] array;
List<MyClass> list;

一个比另一个更可取的情况是什么? 又为什么呢?


#1楼

在大多数情况下,使用List就足够了。 List使用内部数组来处理其数据,并在向List添加比其当前容量更多的元素时自动调整数组的大小,这使其比需要事先了解容量的数组更易于使用。

请参阅http://msdn.microsoft.com/zh-cn/library/ms379570(v=vs.80).aspx#datastructures20_1_topic5 ,以获取有关C#中列表的更多信息,或仅反编译System.Collections.Generic.List<T>

如果需要多维数据(例如,使用矩阵或在图形编程中使用),则可能会改用array

与往常一样,如果内存或性能成为问题,请对其进行衡量! 否则,您可能会对代码做出错误的假设。


#2楼

尚未提及的另一种情况是,当一个项目具有大量项目时,每个项目都由固定在一起的一束相关但独立的变量组成(例如,一个点的坐标或3d三角形的顶点)。 暴露场结构的数组将允许其元素“就地”被有效地修改,这是任何其他集合类型都不可能做到的。 由于结构的数组将其元素连续保存在RAM中,因此对数组元素的顺序访问会非常快。 在代码需要多次顺序通过数组的情况下,结构数组的性能可能比数组或类对象引用的其他集合的性能高2:1; 此外,在适当位置更新元素的能力可以允许结构阵列胜过任何其他种类的结构集合。

尽管数组不可调整大小,但是让代码存储数组引用以及正在使用的元素数量并不困难,并根据需要用更大的数组替换数组。 或者,可以轻松地为行为类似于List<T>但暴露其后备存储的类型编写代码,从而使人们可以说MyPoints.Add(nextPoint);MyPoints.Items[23].X += 5; 。 请注意,如果代码尝试访问列表末尾之外的内容,后者不一定会引发异常,但是在概念上,用法与List<T>非常相似。


#3楼

当集合本身的不可变性是客户端与提供者代码之间的合同的一部分(不一定是集合中项目的不可变性)并且IEnumerable不适合时, 应优先于List使用数组。

例如,

var str = "This is a string";
var strChars = str.ToCharArray();  // returns array

显然,对“ strChars”的修改不会改变原始的“ str”对象,而与“ str”的基础类型的实现级知识无关。

但是假设

var str = "This is a string";
var strChars = str.ToCharList();  // returns List<char>
strChars.Insert(0, 'X');

在这种情况下,仅凭该代码片段尚不清楚insert方法是否将使原始“ str”对象发生突变。 它需要String的实现级别的知识才能进行确定,这破坏了“按合同设计”方法。 对于String来说,这没什么大不了的,但是在几乎所有其他情况下,这可能都是大问题。 将列表设置为只读确实有帮助,但会导致运行时错误,而不是编译时错误。


#4楼

我认为,与其比较每种数据类型的功能,不如说最实用的答案是:“差异对于您需要完成的工作可能并不那么重要,尤其是因为它们都实现了IEnumerable ,因此请遵循流行的约定并使用一个List直到您有理由不这样做为止,这时您可能有理由在List使用数组。”

在大多数情况下,在托管代码中,您会倾向于尽可能使集合易于使用,而不必担心微优化。


#5楼

实际上,很少要使用数组。 每次要添加/删除数据时,请绝对使用List<T> ,因为调整数组的大小非常昂贵。 如果您知道数据是固定长度的,并且出于某些非常特定的原因(基准化之后)想要进行微优化,则数组可能会有用。

List<T>提供更多功能比的阵列(尽管LINQ找齐它一点),并且几乎总是正确的选择。 当然,除了params参数。 ;-p

作为计数器List<T>是一维的; 位置-如您有int[,]string[,,]类的矩形(etc)数组-但是在对象模型中还有其他建模此类数据(如果需要)的方法。

也可以看看:

也就是说,我在protobuf-net项目中大量使用了数组; 完全出于性能考虑:

  • 它做了很多位移,所以byte[]对于编码非常重要;
  • 我使用本地滚动byte[]缓冲区,该缓冲区在向下发送到基础流(和vv)之前填充; 比BufferedStream等更快;
  • 它在内部使用基于数组的对象模型( Foo[]而不是List<Foo> ),因为一旦建立, List<Foo>是固定的,并且需要非常快。

但这绝对是一个例外。 对于一般的业务流程处理,每次List<T>获胜。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!