现在已经很少使用ArrayList与Hashtable,除去取数据不方便之外,在加入元素以及其余操作时,花费的时间也是比较多的,效率低;对其解释涉及到装箱和拆箱的问题;
一、什么是装箱和拆箱
装箱:将数值类型转换成引用类型的值
拆箱:将引用类型转换成数值类型
int n = 10; object o = n;//装箱 int nn = (int)o;//拆箱
二、装箱与拆箱的判别
string str = "123"; int a = Convert.ToInt32(str);
上述代码,虽然是由引用类型转换成值类型;但是并没有发生任何的装箱和拆箱的操作;
首先应该判断两者是否是继承关系,在判断是否是拆箱和装箱;上述代码中,string类型与Int类型并不是继承关系,所以不存在装箱和拆箱的关系;
int b = 1233; IComparable c = b;
上述代码发生了装箱,首先int类型与IComparable类型是继承关系;int继承IComparable,又是由值类型转换成引用类型,所以发生了装箱;
三、检验装箱操作的效率
第一组:
ArrayList arraylist = new ArrayList(); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i=0;i<1000000;i++) { arraylist .Add(i); } sw.Stop(); Console.WriteLine(sw.Elapsed);
输出:00:00:00.0427016
第二组:
List<int> list = new List<int>(); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i=0;i<1000000;i++) { list.Add(i); } sw.Stop(); Console.WriteLine(sw.Elapsed);
输出:00:00:00.0111906
第一组代码耗时长一些,因为发生了装箱;arrayList.Add();中的参数是Object类型的,输入的是int类型,所以发生了由值类型到引用类型的转换;
所以以后在写代码的过程中,尽量避开装箱和拆箱操作,这样会降低效率;