unity面试——C# Arry ArrayList List之间的区别

16 篇文章 0 订阅

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个空间里面。

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值