C# 中数组 、List 、ArrayList 的区别

时间:2023-02-06 19:40:15

C#中数组 、List 、ArrayList 的区别:

数组 :

优点 :

  • 数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单 .

C# 代码实例 :

string[] arr = new string[3];

//赋值
arr [0] = "a";
arr [1] = "b";
arr [2] = "c";

//修改
arr[0] = "d";

缺点 :

  • 数组中插入数据很麻烦 .
  • 声明数组的时候 , 必须同时指明数组的长度 , 数组的长度过长 , 会造成内存浪费 , 数组和长度过短 , 会造成数据溢出的错误 .
  • 声明数组时不清楚数组的长度 , 就变得很麻烦.

数组 & ArrayList :

C#中提供了ArrayList对象来克服这些缺点 .

ArrayList :

说明 :

ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除 .

优点 :

  • ArrayList 增删改查都非常方便 .
  • ArrayList 可以插入不同数据类型的数据 , 所有的数据都当作object类型来处理 .

C# 代码实例 :

ArrayList list = new ArrayList ();
//添加
list.Add ("a");
list.Add (123);

//删除
list.RemoveAt (1);

//修改
list [0] = "c";

//查询
print(list[0]);

缺点 :

  • ArrayList不是类型安全的 , 数据类型可能不一致 , 处理ArrayList中数据的时候 , 可能会报类型不匹配的错误 .
  • 既使插入的是同一类型的数据 , 但在使用的时候 , 需要将它们转化为对应的原类型来处理 . 这就存在了装箱与拆箱的操作 , 会带来很大的性能损耗 !

ArrayList & List :

ArrayList 好像是解决了数组中所有的缺点,那么它应该就是完美的了,为什么在C#2.0后又会出现List呢?

List ( 泛型 ) :

说明 :

如果List集合中插入string字符 , 会报错 , 不能通过编译 . 这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了 .
List不能被构造,但可以创建引用 .

优点:

通过允许指定泛型类或方法操作的特定类型 , 泛型功能将类型安全的任务从您转移给了编译器 . 不需要编写代码来检测数据类型是否正确 , 因为会在编译时强制使用正确的数据类型 . 减少了类型强制转换的需要和运行时错误的可能性 . 泛型提供了类型安全但没有增加多个实现的开销 .

C# 代码实例 :

List<int> list = new List<int>();
list.Add (1);
list.Add (2);

list [0] = 8;
list [1] = 5;

list.RemoveAt (0);

print (list [0]); //5

注意 :

list.RemoveAt 方法以后 后面的值都会往前移 , 第0位移除以后 , 第1位变成第0位 , print 输出的是5 .

其他 :

List list;     //正确 list=null; 
List list=new List(); // 是错误的用法

List list = new ArrayList(); 这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了 . 而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性 .

ArrayList 和 List 的主要区别 :

ArrayList 存在不安全类型(ArrayList会把所有插入其中的数据都当做Object来处理)装箱拆箱的操作(消耗性能)
List是接口,ArrayList是一个实现了该接口的类,可以被实例化。