哪个更好? array,ArrayList或List (在性能和速度方面)

我需要快速处理我的页面。 要添加的值的计数将是动态的。

以上哪一项更受青睐? 支持有正当理由。

编辑:例如:

string str = "a,b,c"; //Count of the number of elements in str is not fixed string[] arr = str.Split(','); 

要么,

 ArrayList al = new ArrayList(); al.Add(str.Split(',')); 

List通常应优先于ArrayList

  • 更快的价值类型,因为它避免拳击。
  • 强类型元素

如果您希望向调用者公开的列表是不可变的,则ListArrayList都支持:

 List.AsReadOnly() ArrayList.ReadOnly(ArrayList list); 

您的问题询问在ArrayListList之间进行选择,但您的示例显示了一个数组,但两者都没有。

“immutable”集合的数组, List表示可变集合。

  • “永恒的”collections – 仅在创作时改变,后来许多人阅读。
  • 可变收集 – 许多变化的所有时间

性能统计(arrays与列表与ReadonlyCollection):

  Array List ReadOnlyCollection Penalties Method 00:00:01.3932446 00:00:01.6677450 00:00:06.2444633 1 vs 1,2 vs 4,5 Generate 00:00:00.1856069 00:00:01.0291365 00:00:02.0674881 1 vs 5,5 vs 11,1 Sum 00:00:00.4350745 00:00:00.9422126 00:00:04.5994937 1 vs 2,2 vs 10,6 BlockCopy 00:00:00.2029309 00:00:00.4272936 00:00:02.2941122 1 vs 2,1 vs 11,3 Sort 

源代码:

 interface IMethods { T Generate(int size, Func generator); int Sum(T items); T BlockCopy(T items); T Sort(T items); } class ArrayMethods:IMethods { public int[] Generate(int size, Func generator) { var items = new int[size]; for (var i = 0; i < items.Length; ++i) items[i] = generator(i); return items; } public int Sum(int[] items) { int sum = 0; foreach (var item in items) sum += item; return sum; } public int[] BlockCopy(int[] items) { var res = new int[items.Length / 2]; Buffer.BlockCopy(items, items.Length / 4 * sizeof(int), res, 0, res.Length * sizeof(int)); return res; } public int[] Sort(int[] items) { var res = new int[items.Length]; Buffer.BlockCopy(items, 0, res, 0, items.Length * sizeof(int)); return res; } } class ListMethods : IMethods> { public List Generate(int size, Func generator) { var items = new List(size); for (var i = 0; i < size; ++i) items.Add(generator(i)); return items; } public int Sum(List items) { int sum = 0; foreach (var item in items) sum += item; return sum; } public List BlockCopy(List items) { var count = items.Count / 2; var res = new List(count); var start = items.Count / 4; for (var i = 0; i < count; ++i) res.Add(items[start + i]); return res; } public List Sort(List items) { var res = new List(items); res.Sort(); return res; } } class ReadOnlyCollectionMethods:IMethods> { public ReadOnlyCollection Generate(int size, Func generator) { return new ReadOnlyCollection(Enumerable.Range(0, size).Select(generator).ToList()); } public int Sum(ReadOnlyCollection items) { int sum = 0; foreach (var item in items) sum += item; return sum; } public ReadOnlyCollection BlockCopy(ReadOnlyCollection items) { return new ReadOnlyCollection(items.Skip(items.Count / 4).Take(items.Count / 2).ToArray()); } public ReadOnlyCollection Sort(ReadOnlyCollection items) { return new ReadOnlyCollection(items.OrderBy(s => s).ToList()); } } static class Program { static Tuple[] CheckPerformance(IMethods methods) where T:class { var stats = new List>(); T source = null; foreach (var info in new[] { new {Name = "Generate", Method = new Func(items => methods.Generate(10000000, i => i % 2 == 0 ? -i : i))}, new {Name = "Sum", Method = new Func(items => {Console.WriteLine(methods.Sum(items));return items;})}, new {Name = "BlockCopy", Method = new Func(items => methods.BlockCopy(items))}, new {Name = "Sort", Method = new Func(items => methods.BlockCopy(items))}, new {Name = "Sum", Method = new Func(items => {Console.WriteLine(methods.Sum(items));return items;})}, } ) { int count = 10; var stopwatch = new Stopwatch(); stopwatch.Start(); T res = null; for (var i = 0; i < count; ++i) res = info.Method(source); stopwatch.Stop(); source = res; stats.Add(new Tuple(info.Name, stopwatch.Elapsed)); } return stats.ToArray(); } static void Main() { var arrayStats = CheckPerformance(new ArrayMethods()); var listStats = CheckPerformance(new ListMethods()); var rcStats = CheckPerformance(new ReadOnlyCollectionMethods()); Console.WriteLine(" Array List ReadOnlyCollection Penalties Method"); for(var i = 0; i < arrayStats.Length; ++i) { Console.WriteLine("{0} {1} {2} 1 vs {3,4:f1} vs {4,4:f1} {5}", arrayStats[i].Item2, listStats[i].Item2, rcStats[i].Item2, listStats[i].Item2.TotalSeconds / arrayStats[i].Item2.TotalSeconds, rcStats[i].Item2.TotalSeconds / arrayStats[i].Item2.TotalSeconds, arrayStats[i].Item1); } } 

List 总是比arrayList快。 List 's不必包含添加到它们的值。

ArrayList只是“接受”对象,这意味着虽然你可以将任何你想要的对象添加到列表中,但是它必须被装箱(由CLR隐式地),然后它必须再次取消装箱(由你明确地)需要价值观。

编辑: 这是一个很好的链接