ArrayList容量,什么更好?c#
我有一个输入,今天大约是450,将来可能会增加。(有时它的运行频率低于450,可能是100或20) 对我来说:ArrayList容量,什么更好?c#,c#,arraylist,capacity,C#,Arraylist,Capacity,我有一个输入,今天大约是450,将来可能会增加。(有时它的运行频率低于450,可能是100或20) 对我来说: 未设定容量 设置容量低(100) 设置容量略小于450 将容量设置为略高于450 将容量设置为略高于450 将容量设置为远高于预期的值(增加80%,两次?) 使用n作为增加数(不是实际复杂性) 我想,如果把它设置为低于预期的n=440或其他值,会给我“复杂性”n+2n=(3n) 然而,如果我把它稍微放在上面(n=460),就会得到n 另外,如果我设置n=800,我会得到一个很高的n
- 未设定容量
- 设置容量低(100)
- 设置容量略小于450
- 将容量设置为略高于450
- 将容量设置为略高于450
- 将容量设置为远高于预期的值(增加80%,两次?)
- 有了这些数字(<1000),就没什么关系了
- 如果没有初始容量,您将增加8、16、32、64等日志(n)重新分配
N
的空间超调是不可避免的。老实说,我掩盖了所有关于N的讨论,因为我相信它会偏离实际点,即相对效率
“最佳选择”是使用System.Collections.Generic.List
,将其初始化为合理的值,然后在分析告诉您这是一个问题之前,不要担心它
泛型列表的使用为您提供了强大的类型支持,并且使用值类型可以避免装箱问题
如果列表大小不断变化,或者列表的使用时间不长,则对其进行修剪不会带来太大的改进(如果有)。如果您了解所涉及的大小的某些信息,则可以通过使用占用初始容量的重载构造函数来节省一些重新分配:
var list = new List<int>(450);
var列表=新列表(450);
在达到初始容量后,列表将继续使用其自身的内部逻辑调整大小,以决定要获取的容量(如果未指定大小,则默认为将大小加倍:从4开始,然后是8、16、32等)。ArrayList适用于.net 1.1 您可以使用
列表
作为泛型类
它支持存储特定类型的值,而无需对对象进行装箱和取消装箱。ArrayList只存储对象引用
有什么原因不能使用通用列表吗?这将扩展/收缩到需要存储的元素数。如果必须使用数组,则我会将其设置为预期最大值的两倍(即800)因为这是一个相对较小的数字。对于数字来说,这将是一个要分配的小内存量。这真的是您处理过程中的瓶颈吗?这很大程度上取决于您需要存储的项的大小。整数列表与大结构…您考虑的是几毫秒?我将完全避免使用
ArrayList
strong typedList
。thx,arraylist这个名字让我很困惑,我更熟悉java。起初我想知道arraylist是如何知道它的类型的,猜测它在编译时就理解它了。@Vixen它没有,它对所有事情都使用object
,因此对值类型进行装箱。是的,我现在知道了,但是我不知道有泛型列表,我认为C#的ArrayList版本与Java的ArrayList相同-