一、ArrayList和List的主要区别
ArrayList → 不带泛型,数据类型丢失,需要装箱拆箱
List → 带泛型,数据类型不丢失,不需要装箱拆箱
ArrayList:
命名空间:System.Collections
ArrayList存在不安全类型,会把所有数据都当做Object来处理,装箱拆箱操作费时。
IList是接口,ArrayList是一个实现了该接口的类,可以被实例化。
ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的,所以在声明时不需要指定它的长度。
泛型List:
命名空间:System.Collections.Generic
因为ArrayList存在不安全类型与装箱拆箱的缺点,所以出现了泛型的概念。List类是ArrayList的泛型等效类,用法相似,List类也继承了IList接口。区别在于声明List集合是,需要为其声明List集合内数据的对象类型。
名词解释
装箱:在值类型向引用类型转换时发生;
拆箱:在引用类型向值类型转换时发生;
值类型:直接将内存存储在栈内,由系统自动释放资源的数据类型;
引用类型:由类型的实际值引用(类似于指针)表示的数据类型,通俗点说就是在编程时需要new出来的变量类型都是引用型,引用类型是存放在内存的堆中;
栈:由大至小的分配,先进后出,直接存放值类型的地方;我们一般出现的内存溢出就是由于栈位都分配完了;
堆:由小至大的分配,随意存储,存放引用类型的地方;
代码案例:
public void ArrayListDemo()
{
ArrayList list = new ArrayList();
list.Add(1);
list.Add(2);
foreach(int i in list)
{
Console.WriteLine("value is {0}", i);
}
}
Add(1)装箱,Add(2)装箱,foreach(int i in list) 拆箱+拆箱,输出为string装箱+装箱,共4装2拆。
public void ListDemo()
{
List<int>list = new List<int>();
list.Add(1);
list.Add(2);
foreach(int i in list)
{
Console.WriteLine("value is {0}", i);
}
}
Add无装拆,foreach(int i in list)无装拆,输出为string装箱+装箱,共2装0拆。