有人能告诉我
List<int>
和 int[]
哪个更高效吗?因为我正在开发一个项目,并且你可能知道效率是非常重要的问题。如果您在帖子中添加一些引言注释,那就太好了 :)(list should be resizable) ? List<int> : int[]
List<int>
是一个可以根据需要调整大小的 int[]
包装器。使用 JIT 内联,它们应该执行几乎相同,但是 JIT 更容易从 int[]
中获得额外的性能优势,因为它是一个带有专用 IL 指令的 CLI 原始类型。
只是为了好玩,我运行了这个:
int cap = 100000;
Stopwatch sw1 = new Stopwatch();
sw1.Start();
int[] ix = new int[cap];
for (int x = 0; x < cap; x++)
{
ix[x] = 1;
}
sw1.Stop();
Stopwatch sw2 = new Stopwatch();
sw2.Start();
List<int> iy = new List<int>(cap);
for (int y = 0; y < cap; y++)
{
iy.Add(y);
}
sw2.Stop();
Console.WriteLine(cap.ToString() + " int[]=" + sw1.ElapsedTicks.ToString());
Console.WriteLine(cap.ToString() + " List<int>=" + sw2.ElapsedTicks.ToString());
Console.ReadKey();
并且得到了以下结果:
100000个int[]=1796542 100000个List=2517922
我用毫秒计时,分别得到了0和1。显然,int[]更快,但除非你处理的是巨大的数组,否则差异微乎其微。
T
是值类型,那么 T[]
将是一个值类型的数组,而不是一个装箱后的值类型数组。 - LouList<int>
功能,而且(这是一个非常严肃的 AND)性能是一个严重问题,那么请使用 int[]
。否则,请使用 List<int>
。T[]
时,List<T>
的大多数特性都可以作为Array
类的静态成员使用。如果列表是固定大小的,请使用T[]
,因为两者都实现了IList<T>
接口。 - Sam Harwell后者更有效。
在源代码中,List<>
被一些数组命名。
例如,List<Type> aa=new List<Type>();
通常情况下,声明一个 array Type[]
,它的长度是一个确定的数字。
换句话说,如果你声明了一个 List<>
,一个大空间已经被使用了。
如果 List<>
的元素超出了长度,那么数组应该被复制到另一个更大的数组中。
因此,最好不要使用 List<>
。
更好的方法是声明其长度。
List<Type> aa=new List<Type>(10);
List内部使用数组,因此正确使用数组始终更有效率(或至少一样有效率)。
List<T>.Sort
只是在内部数据数组上调用 Array.Sort<T>
,这对于任何数组都可用。搜索也是一样。List<T>
唯一真正提供的是自动调整大小和 ForEach()
,但我想 T[]
的枚举器甚至更快,因为它不必检查数组是否已更改。 - Sam Harwell
List<int>
通过使用自动调整大小来减少编码时间,那就使用它。如果你只需要一个静态大小的数组,请使用int[]
。参考280Z28所接受的答案。 - awe