1:数组 Array 命名空间:using System
优点:内存:连续存储 因此索引速度快 赋值和修改元素简单 时间复杂度为O(1)
缺点:因为是分配在连续内存所以要提前确定内存大小 空间的连续导致了存储效率低 插入和删除元素效率低
int[] tempArray = new int[4] //定义数组 一定要申请空间 指明数组的长度 只能存储同一种数据类型数据
//赋值
tempArray[0] = 1;
tempArray[1] = 2;
tempArray[2] = 3;
//修改值
tempArray[2] = 4;int [] arr_1 = new int[2]{1,2,3};
int[] arr_2 = new int[]{1,2,3};
int[] arr_3 = {1,2,3};
数组中的浅拷贝问题
int[] newArray = array;
把数组array赋值给newArray,这是一个浅拷贝的问题,就是把栈中指向堆中的地址赋值给新数组,C#中的数组元素存在堆中,newArray和array指向的是同一个数组,如果改变了array中的值,newArray中的值也会改变。如果想实现真正的拷贝,深拷贝用CopyTo, array.CopyTo(newArray,0);就是把array中的值拷贝给newArray,实现深拷贝。
2:ArrayList 命名空间System.Collections
优点:大小是按照其中存储的数据来动态扩充与收缩的。所以声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除 可以存储不同数据类型的数据
缺点:因为可以插入不同数据类型(把所有的数据都当做了Object类型来处理)会存在装箱拆箱操作装箱与拆箱的过程是很损耗性能的。
装箱:就是将值类型的数据打包到引用类型的实例中
比如将int类型的值1赋给object对象o
int i=1;
object o=(object)i;
拆箱:就是从引用数据中提取值类型
比如将object对象o的值赋给int类型的变量i
object o=1;
int i=(int)o;ArrayList tempArrayList = new ArrayList()
//新增数据
tempArrayList.Add("abcdef");
tempArrayList.Add(1);
//修改数据
tempArrayList[2] = 345;
//移除数据
tempArrayList.RemoveAt(0)
//插入数据
tempArrayList.Insert(0, "hello world");
3:泛型List using System.Collections.Generic
List类也继承了IList接口最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。大小是按照其中存储的数据来动态扩充与收缩的。所以声明List对象时并不需要指定它的长度。可以很方便的进行数据的添加,插入和移除
并且不需要有装箱拆箱的操作
List<int> tmepList = new List<int>();
//新增数据
tmepList.Add(1234);
//修改数据
tmepList[0] = 3456;
//移除数据
tmepList.RemoveAt(0);//插入不同类型会报错并且不能通过编译
tmepList.Add("ddddd");
数组可以有多维数组 而ArrayList List 只有一个维度
array的效率要比List的要高一些,当数组长度不是很大时,两者没什么区别,建议用List<>,毕竟是可变长度,可以Add;特殊应用还是建议用array,不提倡用ArrayList.
因此需要存储同种类型的数据 如果数据数量固定并且插入删除操作不用就用Array
需要经常插入删除 List
需要存储不同种类型的数据则要 ArrayList
list 在扩展空间的时候会成倍增加,比如说一个申请了4个内存空间 加入第五个数据 会自动先new一个8个空间的对象 然后把以前的四个数据放进来保存到 8个空间里面。