ArrayList和List
1.ArrayList:
ArrayList的特点:
(1).其数据存储类型是基于数组的,采用顺序结构的存储模式,其操作方式也是基于数组的操作原型进行。
(2).ArrayList为用户直接提供了Add,Insert,Remove等一系列编写起来较为繁琐的函数,使其具有面向对象的特点,便于编程。
(3).ArrayList是一种相对自由的数据结构,其元素不一定需要同一类型,可以选择插入不同类型的元素来进行操作。
ArrayList常见的使用实例:
1 public static void TestArrayList(ArrayList arrayList) 2 { 3 arrayList.Add(1);//在末端添加元素 4 arrayList.Add(1); 5 arrayList.Add("hello");//可添加不同元素 6 arrayList.Insert(0, 123 + "abc");//在指定位置添加元素 7 arrayList.Remove(1);//去除第一个为1的元素(只去除1次) 8 arrayList.RemoveAt(0);//在指定位置添加元素 9 arrayList.AddRange(arrayList);//将另一个同一类型的数据结构插入到尾部 10 }
ArrayList的缺点:
(1).所有储存的数据都将其转换为了object这一父类(解释了为什么可以插入任意类型的数据)
(2).存在类型不安全问题,因为都被转为了object类,所以就导致了之前的类型函数无法正常调用的问题,所以我们经常要将其再次转为原类型进行处理。
(3).需要频繁进行装箱和拆箱的操作,导致其效率低下。
补充:装箱和拆箱:
1.装箱
(1).子类隐式转换为父类的过程。
(2).值类型转为引用类型的过程。(具体为:在栈空间开辟一个存储这些值类型地址的地址码的空间,并对应这个地址码的地址在堆中分配空间存入值类型中的数据)
2.拆箱
(1).父类显示转换为子类的过程
(2).被转为引用类型的值类型重新恢复的过程。(即将栈中存储地址的空间清楚,并将在堆中存储的数据重新存回到栈中)
分析以下代码:
1 public static void Main() 2 { 3 Int32 v = 5; 4 Object o = v; 5 v = 123; 6 7 Console.WriteLine(v + "," + (Int32)o); 8 }
代码拆装箱解析:
(1).第4行Int32类型被装箱成为object类型,执行了一次装箱操作。
(2).第7行中,第一个v作为Int32类型被转为了String(引用)类型,执行一次装箱操作。
o做为Object类型被转为了Int32类型,执行了一次拆箱操作。
o被转为Int32类型后,又要再转为String类型,执行一次装箱操作。
总结:以上代码共执行了3次装箱操作和1次拆箱操作
为了克服以上的问题缺点,引入了更加规范合理的一种数据结构类型:List
2.List:
List的特点:
(1).其定义时,一定要有<数据类型(如:int,也可以是自己定义的类型)>,这也就说明其不能存入任意的数据类型,也不会点存入的数据类型做转换。
(2).其他的一些操作函数和ArrayList十分类似,且底层原理也是相同的。
(3).可以通过索引来为元素赋值或修改。(但一定要在范围内,不允许越界)
List常见使用实例:
1 public static void TestArrayList() 2 { 3 List<int> list = new List<int> { 1, 2, 3, 4 };//可以对List直接进行初始化赋值 4 list.Add(1); 5 list.Insert(0, 123); 6 list.Remove(1); 7 list.RemoveAt(0); 8 list.AddRange(list); 9 list.Clear();//清空数组中的所有元素 10 }
总结:List即数组的升级版,使用泛型来确定存储的数据类型,避免了数据不匹配和各种数据转化的风险。

浙公网安备 33010602011771号