文章目录
- 1. 泛型与非泛型:
- 2. 性能:
- 3. API 使用:
- 4. 类库引用:
- 5. 扩容机制:
- 举例说明:
在C#中,
ArrayList
是.NET Framework 1.0引入的一个非泛型集合类,而
List<T>
是.NET Framework 2.0推出的泛型集合类。两者的主要区别如下:
1. 泛型与非泛型:
-
ArrayList
:可以存储任何类型的对象,因为它是基于Object
的,这意味着它不提供编译时类型检查,因此容易引发运行时类型转换错误。 -
List<T>
:需要指定元素类型(如List<int>
、List<string>
等),只能存储指定类型或其派生类型的元素,提供了编译时类型安全。
2. 性能:
-
ArrayList
:由于其对所有元素都作为Object
处理,对于值类型(如整数、浮点数等)会进行装箱和拆箱操作,这会带来额外的性能开销。 -
List<T>
:对于值类型,不会发生装箱和拆箱,所以性能通常优于ArrayList
。尤其是在频繁插入、删除和访问大量数据的情况下,这种差异更为明显。
3. API 使用:
-
ArrayList
:使用时需显式地进行类型转换。
ArrayList arrList = new ArrayList();
arrList.Add("Hello"); // 可以添加任何类型
string str = (string)arrList[0]; // 需要手动转换类型
-
List<T>
:由于类型已知,可以直接操作。
List<string> list = new List<string>();
list.Add("Hello"); // 只能添加字符串类型
string str = list[0]; // 直接获取字符串,无需转换
4. 类库引用:
-
ArrayList
:需要引用System.Collections
命名空间。 -
List<T>
:需要引用System.Collections.Generic
命名空间。
5. 扩容机制:
- 两者都能动态扩容,但
List<T>
的内部实现经过优化,通常情况下其自动扩容策略更高效。
举例说明:
// ArrayList 示例
ArrayList nonGenericList = new ArrayList();
nonGenericList.Add(1); // 添加整数
nonGenericList.Add("World");
try {
int number = (int)nonGenericList[0]; // 强制转换为整数
string text = (string)nonGenericList[1];
Console.WriteLine(number + " " + text);
} catch (InvalidCastException e) {
Console.WriteLine("类型转换异常:" + e.Message);
}
// List<T> 示例
List<int> genericList = new List<int>();
genericList.Add(1); // 添加整数
genericList.Add(2);
string cannotAddString = "World"; // 尝试添加字符串将导致编译错误
int number = genericList[0];
Console.WriteLine(number);
// 如果我们有一个List<string>
List<string> stringList = new List<string>();
stringList.Add("Hello");
string text = stringList[0];
Console.WriteLine(text); // 直接输出字符串,无需类型转换
总结来说,List<T>
不仅提高了代码的可读性和安全性,还减少了不必要的性能损失,因此,在大多数现代编程场景下,推荐使用List<T>
而非ArrayList
。