数组、ArrayList以及泛型List之间的区别?
一、数组
1、优点:
1、数组在内存中时连续存储的,所以它的索引速度是非常快的
2、赋值和修改也是很简单的
2、缺点:
1、在数组的两个数据间插入数据很麻烦
2、在声明数组的时候必须给定指定的数组长度。如果说数组的长度过长,会造成内存浪费;过短会造成数据溢出的错误。所以说在声明数组时我们并不清楚数组的长度,这就变的很棘手了。
3、在声明数组的时候必须给定指定的数据类型。
string[] a = new string[2];//定义string类型的数组,并分配2个空间
//在数组中添加数据
a[0] = "A";
a[1] = "B";
//修改数据
a[0] = "a1";
for (int i = 0; i < a.Length; i++)//通过for循环打印数组中的值
{
MessageBox.Show(a[i]);
}
二、ArrayList
1、什么是ArrayList?
ArrayList是.Net Framework提供的用于数据存储和检索到专用类,它是命名空间System.Collections下的一部分。
2、优点:
1、声明时不需要指定长度,因为它的大小是按照其中存储的数据来动态扩充与收缩的
2、可以添加、插入、修改和移除数据
3、可以存储任意类型的数据,因为在存储数据的时候它会把这些数据当作object类型来处理,所以这也是它的不足之处
3、缺点:
ArrayList不是类型安全的。为什么这么说?
因为将ArrayList中的数据拿出来使用的时候需要通过数据类型转换,否则会出现类型不匹配的错误。
例如ArrayList中存储了多个不同数据类型的数据时,当我们想用ArrayList中的数据来处理某些问题的时候,就必须通过多次的类型转换才能拿出来。这就存在了装箱与拆箱的操作,会带来很大的性能损失。
ArrayList a = new ArrayList();
//添加数据
a.Add(0);
a.Add("hellow");
a.Add(0.07);
//修改数据
a[0] = 1;
a.RemoveAt(0);//移除数据
a.Insert(1, "didi");//在第2个数据前插入数据
a.Clear();//移除所有元素
for (int i = 0; i < a.Count; i++)//通过for循环打印ArrayList中的数据
{
MessageBox.Show(a[i].ToString()+"");//将数据类型转换为string类型
}
MessageBox.Show((int)a[0]+"");//数据类型转换,打印a[0]的值
4、什么是装箱和拆箱?
(1)装箱:就是将值类型的数据打包到引用类型的实例中
//比如说将int类型的值赋给object类型a
int i=123;
object a=(object)i;
(2)拆箱:就是从引用类型中提取值类型
//比如将object对象a的值赋给int类型的变量i
object a=123;
int i=(int)a;
注:装箱和拆箱的过程是很耗损性能的
三、泛型List
ArrayList拥有的优点泛型List都有(除了不能存储所有类型的数据)。
List在定义的时候必须声明一个类型的数据类型。
List<int> a = new List<int>();//实例化泛型List
a.Add(1);
a.Add(2);
//a.RemoveAt(0);//移除指定的索引元素
// a.Remove(1);//删除第一个元素
// a.Clear();//清空所有元素
a.Insert(0, 3); //在指定元素前插入一个元素
for (int i = 0; i < a.Count; i++)
{
MessageBox.Show(a[i] + "");
}
四、总结
数组 | ArrayList | 泛型List |
---|---|---|
定义时需要声明数据类型和长度 | 不需要 | 只需要声明数据类型 |
可以添加和修改数据 | 添加、修改、移除添加指定的数据、移除所有元素 | 添加、修改、移除添加指定的数据、移除所有元素 |
一个数组只能容纳一种数据类型 | 容纳所有数据类型,但是取出来的时候要通过数据类型转换 | 一个泛型List只能容纳一种数据类型 |