文章目录

  • 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