ArrayList和List本质上和使用上的区别详解

您所在的位置:网站首页 list子类 ArrayList和List本质上和使用上的区别详解

ArrayList和List本质上和使用上的区别详解

2023-11-27 09:46| 来源: 网络整理| 查看: 265

ArrayList和List的主要区别是什么? 首先我们先了解一下这两者的定义. 名词解释

ArrayList: ArrayList是命名空间System.Collections下的一部分,在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度。所有加入的数据均为object,使用需要装箱与拆箱。

泛型List: List是命名空间System.Collections.Generic下,因为ArrayList存在不安全类型与装箱拆箱的缺点,所以出现了泛型的概念。List类是ArrayList类的泛型等效类,它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。

看完名词解释,那我们回到最开始的话题. 那么ArrayList和list到底有什么区别呢? 首先是本质上区别

List是一个接口,而ArrayList是一个类,它实现了List接口。 所以List不能被构造,List list=new List()这种写法是错误的,而ArrayList就可以被构造。 List list = new ArrayList();这句创建了一个ArrayList的对象后把向上转型成了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。 而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。

两者都是集合.

ArrayList t类型不安全,因为加入的数据为object类型,所以需要装箱与拆箱,效率较低。 List:声明时就决定了类型,所以是类型安全的,省掉了装箱与拆箱的过程,效率比ArrayList要高。

ArrayList就是一个List而已。 泛型集合的优势就是类型安全和无装箱。

其次是使用上的区别 名词解释

装箱:在值类型向引用类型转换时发生;

拆箱:在引用类型向值类型转换时发生;

值类型:直接将内存存储在栈内,由系统自动释放资源的数据类型;

引用类型:由类型的实际值引用(类似于指针)表示的数据类型,通俗点说就是在编程时需要new出来的变量类型都是引用型,引用类型是存放在内存的堆中;

内存堆跟栈的定义跟数据结构的堆栈是不同的

栈:由大至小的分配,先进后出,直接存放值类型的地方;我们一般出现的内存溢出就是由于栈位都分配完了;

堆:由小至大的分配,随意存储,存放引用类型的地方;

C#的值类型

整型:Int; 长整型:long; 浮点型:float; 字符型:char; 布尔型:bool; 枚举:enum; 结构:struct;

名词解释完了以后,我们来说ArrayList与List的使用区别。 先看ArrayList的使用 public void ArrayListDemo() { ArrayList list = new ArrayList(); list.Add(1); list.Add(2); foreach(int i in list) { Console.WriteLine("value is {0}", i); } }

由于ArrayList的每个item默认是Object的类型,所以当我们执行语句list.add(1);的时候,就是做了一次装箱的操作。同理,在for循环里list的每一项都要做一个拆箱的操作才能得到变量i,最后到打印变量i时,由于字符串也是引用类型,所以也要做一次的装箱的操作。这里前后一共做了6次的装箱拆箱(4次装箱,2次拆箱),每一次的装箱拆箱都涉及CPU以及内存的分配,都是性能的损耗。

由.net2.0开始,就引入了泛型这个很好用的东西. 下面看看List的使用: public void ListDemo() { Listlist = new List(); list.Add(1); list.Add(2); foreach(int i in list) { Console.WriteLine("value is {0}", i); } }

由于List使用了泛型,我们指定了item必需是int类型,所以在add item的时候,不需要再进行装箱拆箱的操作,一直到打印i的时候,才需要做装箱的操作,整段代码执行完以后,一共才进行2次的装箱拆箱(2次装箱,0次拆箱)。

如果List的item多,程序运行时,相对于ArrayList来说就会节省很多的系统资源。

所以List与ArrayList的使用区别,到最后就是性能的表现问题.

注意;

.net的泛型与Java的泛型是不一样的,虽然都叫泛型,但.net对泛型的类型指定在编译运行时是不会取消的,所以大大减少了类型转换(装箱拆箱)的操作,而Java在编译时泛型的类型指定是移除了,所以即使编码时指定了相关类型,但运行时依然要进行类型转换(装箱拆箱)的操作,性能没有得到提升。虽然如此,泛型除了提高运行性能外,还有其它的用途,例如增加程序的可读性,增加程序的编程安全性等。所以即使在Java中使用泛型没有得到效率的提升,但无论在编程的习惯上,还是提高代码的质量上都提倡使用泛型。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3