一、数组和集合的比较
1、数组声明了元素类型,但集合没有,因为集合中所用元素都存储为对象。数组的大小是固定的,不能增加和减少;而集合类可根据需要动态调整大小。
2、检索元素的方式不同。
二、装箱与拆箱
1.装箱在值类型向引用类型转换时发生
object obj =1;
这行语句将整型常量1赋给object类型的变量obj;众所周知常量1是值
类型,值类型是要放在栈上的,而object是引用类型,它需要放在堆
上;要把值类型放在堆上就需要执行一次装箱操作。
以上就是装箱所要执行的操作了,执行装箱操作时不可避免的要在堆上
申请内存空间,并将堆栈上的值类型数据复制到申请的堆内存空间
上,这肯定是要消耗内存和cpu资源的。
2.拆箱在引用类型向值类型转换时发生
object objValue =4;
int value =(int)objValue;
上面的两行代码会执行一次装箱操作,将整型数字常量4装箱成引用类
型object变量objValue;然后又执行一次拆箱操作,将存储到堆上的引
用变量objValue存储到局部整形值类型变量value中。
拆箱操作的执行过程和装箱操作过程正好相反,是将存储在堆上的引用
类型值转换为值类型并给值类型变量。
三、装箱拆箱示意
四、测试代码图示(对比ArrayList和泛型List<T>)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace Test01
{
class Student
{
}
class Teacher
{
}
class Program
{
static void Main(string[] args)
{
TestList();
}
public static void TestList()
{
//非泛型的情况
ArrayList stus = new ArrayList();
stus.Add(new Teacher()); //存入Teacher类
for (int i = 0; i < stus.Count; i++)
{
//Student s = (Student)stus[i]; //强制转成Student类会报错
//需要写一个判断是否为Student类,是的话才能放入
if (stus[i] is Student)
{
Student s = (Student)stus[i];
}
}
//泛型List<>
List<Student> list = new List<Student>(); //只收Student类型
//list.Add(new Teacher()); //无法放入,会报错
list.Add(new Student());
List<Student> list = new List<Student>();
list.Add(new Student());
}
}
}
1、带泛型的集合,用于规避掉某些类型转换错误,具有专一性
2、如果要求Teacher类和Student类放入一个集合当中,则可以使用ArrayList