Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ArrayList容量,什么更好?c#_C#_Arraylist_Capacity - Fatal编程技术网

ArrayList容量,什么更好?c#

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

我有一个输入,今天大约是450,将来可能会增加。(有时它的运行频率低于450,可能是100或20)

对我来说:

  • 未设定容量
  • 设置容量低(100)
  • 设置容量略小于450
  • 将容量设置为略高于450
  • 将容量设置为略高于450
  • 将容量设置为远高于预期的值(增加80%,两次?)
使用n作为增加数(不是实际复杂性) 我想,如果把它设置为低于预期的n=440或其他值,会给我“复杂性”n+2n=(3n)

然而,如果我把它稍微放在上面(n=460),就会得到n

另外,如果我设置n=800,我会得到一个很高的n(几乎2n)(很高,但我会使用TrimToSize来使它更好

最好的选择是什么?

  • 有了这些数字(<1000),就没什么关系了

  • 如果没有初始容量,您将增加8、16、32、64等日志(n)重新分配

因此,只要使用任何接近目标的值。400在这里等于800。您可能会有1个重新分配,并且几乎
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 typed
    List
    。thx,arraylist这个名字让我很困惑,我更熟悉java。起初我想知道arraylist是如何知道它的类型的,猜测它在编译时就理解它了。@Vixen它没有,它对所有事情都使用
    object
    ,因此对值类型进行装箱。是的,我现在知道了,但是我不知道有泛型列表,我认为C#的ArrayList版本与Java的ArrayList相同-