装箱:将值类型转化成引用类型。
下面总结了值类型的实例进行装箱发生的事情。
在托管堆上分配内存,内存大小是值类型各字段所需的内存量。还要加上托管堆所有对象的两个额外成员。(类型对象指针和同步块索引)所需的内存量。
值类型的字段复制到新分配的托管堆内存中。
返回对象地址。该地址是对象的引用。值类型转化成了引用类型。
拆箱:将引用类型转成值类型。
1、首先获取托管堆中属于值类型那部分字段的地址,这一步是严格意义上的拆箱。2、将引用对象中的值拷贝到位于线程堆栈上的值类型实例中。
拆箱不是直接将装箱过程倒过来。拆线的代价要不装箱低的多。拆箱实际上就是获取托管堆中属于值类型那部分字段的地址
的过程,该指针指向包含在一个对象中的原始值类型(数据字段)。所以和装箱不同,拆箱不要求在内存中复制任何字节。拆箱后面紧跟着一次字段复制。
注意:
1.如果包含“对已装箱值类型实例的引用”的变量为null,抛出NullReferenceException的异常。
2.如果引用的对象不是所需值类型的已装箱实例,抛出InvalidCastException的异常。
ArrayList和List<T>的区别
泛型集合类对非泛型集合类进行了大量的改进。例如API得到了简化和曾江,集合类的性能也得到了显著提升。
但最大的改进就是泛型集合类允许开发人员在操作值类型的集合时不需要对集合中的项进行装箱操作。单这一项改进,就是性能提高了不少。
这是因为托管堆中需要创建的对象减少了,进而减少了应用程序需要执行的垃圾回收次数。另外,开发人员还获得了编译时的类型安全性源代码,也因为强制类型砖混的次数减少而变得更加清晰。