一定义
可以通过遍历每个元素来访问的一组对象,一个集合包裹多个元素,即一个集合类对象和N个元素对象。
在学习集合的时候总是提到装箱和拆箱,那什么时候装箱什么时候拆箱呢?数据类型分为值类型和引用类型。装箱就是将值类型转换为引用类型,拆箱就是将引用类型转换为值类型。集合中说到装箱是将值类型的数据添加到集合中时,拆箱是在使用集合中的数据的时候进行的。下面看一个小例子:
<span style="font-size:18px;">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace 集合 { class StackTest { public static void Main() { Stack chengji = new Stack(); //装箱过程,当将值类型数据添加到集合中时,就是装箱的过程,集合将将这些键值对封装为一个个的object对象 chengji.Push ("1 语文"); chengji.Push("2 数学"); chengji.Push("3 英语"); //拆箱当使用的时候就是拆箱的时候,foreach循环将object类型的转换为了string类型就是装箱前数据的类型。如果使用其他类型在运行的时候将会报错。 foreach (string obj in chengji) { Console.Write("{0}", obj); Console.WriteLine(); } Console.Read(); } } }</span>
个人理解:使用集合并不是所有的时候都会用到装箱和拆箱。只有当数据为值类型的时候,如果用内存分析来理解也许会更容易些。
通过上面的内存分析可以看出如果数据时值类型的那么当装箱的时候就会在堆中新建一个对象,用于存放数据,栈中只存放对数据的引用。如果数据是引用类型的,就不存在装箱和拆箱,向集合中添加数据后,直接将引用指针指向父类object。无论在添加到集合前是什么类型的,添加后都会成为object类型。
拆箱的时候直接将值赋给在栈中的内存。如果是引用类型那么直接指向子类对象。此时不是拆箱是父类转向子类的操作。从上面的分析中不难看出,值类型的数据在装箱的时候都会在堆中新建一个对象,这样增加了内存的压力。在拆箱的时候需要强制转换为原类型或原类型父类,否则在运行时将会报错。引用类型的数据虽然不进行装箱和拆箱,但是在使用时也需要强制类型转换。
ps:为什么要使用装箱和拆箱啊?
所谓的集合类就是集合的类型。根据用途不同我们将数据定义为便于使用的数据类型,我们也可以根据需要为数据选择合适的集合类型。
集合的常用类型有arraylist、queue、stack、hashtable、sortedlist。每个集合类型都有各自的特点和使用情况。
arraylist:使用大小可按需动态增加的数组实IList接口。
queue:表示对象的先进先出集合
stack:表示对象的简单的先进后出集合
hashtable:表示键/值对的集合,这些键/值对根据键的哈希代码进行组织
sortedlist:表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。
总结:
本文中讲的都是非泛型集合下一篇将讲述泛型和泛型集合。集合总的来说是对添加的数据的操作。