ArrayList vs List <> in C#
ArrayList
和List<>
在C#中有什么区别?
只有List<>
有一个types,而ArrayList
没有?
是的,非常多。 List<T>
是一个generics类。 它支持存储特定types的值,而不会向object
转换或从object
(当T
是ArrayList
情况下的值types时,会产生装箱/拆箱开销)。 ArrayList
只是存储object
引用。 作为一个通用的集合, List<T>
实现了通用的IEnumerable<T>
接口,并且可以在LINQ中轻松使用(不需要任何Cast
或OfType
调用)。
ArrayList
属于C#没有generics的日子。 它不赞成使用List<T>
。 你不应该在目标.NET> = 2.0的新代码中使用ArrayList
,除非你必须与使用它的旧API接口。
使用List<T>
可以防止转换错误。 避免运行时转换错误非常有用。
例:
这里(使用ArrayList
)你可以编译这个代码,但是你稍后会看到一个执行错误。
ArrayList array1 = new ArrayList(); array1.Add(1); array1.Add("Pony"); //No error at compile process int total = 0; foreach (int num in array1) { total += num; //-->Runtime Error }
如果使用List
,则可以避免这些错误:
List<int> list1 = new List<int>(); list1.Add(1); //list1.Add("Pony"); //<-- Error at compile process int total = 0; foreach (int num in list1 ) { total += num; }
参考: MSDN
添加到以上几点。 在64位操作系统中使用ArrayList
比在32位操作系统中使用2倍的内存。 同时,通用列表List<T>
将使用比ArrayList
less得多的内存。
例如,如果我们在32位使用19MB的ArrayList
,则64位需要39MB。 但是,如果你有一个32位的8MB的generics列表List<int>
,那么在64位中只需要8.1MB,与ArrayList相比,这是一个481%的差异。
源: ArrayList与基本types和64位的generics列表
另一个不同之处在于线程同步。
ArrayList
通过Synchronized属性提供了一些线程安全性,它在集合周围返回一个线程安全的包装。 包装器通过在每个添加或删除操作上locking整个集合来工作。 因此,试图访问集合的每个线程都必须等待轮到锁。 这不可扩展,并可能导致大型集合显着的性能下降。
List<T>
不提供任何线程同步; 当多个线程同时添加或删除项目时,用户代码必须提供所有同步。
更多信息.Net框架中的线程同步
ArrayList不是types安全的,而List是types安全的。 简单:)。
ArrayList
是不同types数据的集合,而List<>
是它自己的依赖的类似types的集合。
使用“列表”你可以防止铸造错误。 避免运行时转换错误非常有用。
例:
这里(使用ArrayList)你可以编译这个代码,但是你稍后会看到一个执行错误。
// Create a new ArrayList System.Collections.ArrayList mixedList = new System.Collections.ArrayList(); // Add some numbers to the list mixedList.Add(7); mixedList.Add(21); // Add some strings to the list mixedList.Add("Hello"); mixedList.Add("This is going to be a problem"); System.Collections.ArrayList intList = new System.Collections.ArrayList(); System.Collections.ArrayList strList = new System.Collections.ArrayList(); foreach (object obj in mixedList) { if (obj.GetType().Equals(typeof(int))) { intList.Add(obj); } else if (obj.GetType().Equals(typeof(string))) { strList.Add(obj); } else { // error. } }
对我来说,了解你的数据。 如果我继续在效率的基础上扩展我的代码,那么我将不得不selectList选项作为破解我的数据的一种方式,而不是总是对types特别是“自定义types”感到疑惑的不必要的步骤。 如果机器理解差异,并可以确定实际处理的数据types,那么为什么我应该花时间和浪费时间通过“如果其他”的决定? 我的理念是让机器为我工作而不是在机器上工作? 了解不同目标代码命令的独特差异,可以使您的代码高效运行。
汤姆·约翰逊(一进一出)
这不仅是差异。 ArrayList成员可以像普通数组一样通过索引来访问,并且ArrayList成员也可以很容易地按正向和反向顺序sorting,两个ArrayList可以很容易地合并,而简单的List则不是这样。 查看更多
http://www.cirvirlab.com/index.php/c-sharp-code-examples/112-c-sharp-arraylist-example.html