ArrayList——数组与ArrayList的关系与区别

数组([]):最高效;但是其容量固定且无法动态改变;
ArrayList:容量可动态增长;但牺牲效率;
建议:

首先使用数组,无法确定数组大小时才使用ArrayList!

1.效率:
数组扩容是对ArrayList效率影响比较大的一个因素。
每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的1.5倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

ArrayList是Array的复杂版本
ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。

2.类型识别:
ArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object,编译时不检查类型,但是运行时会报错。
注:jdk5中加入了对泛型的支持,已经可以在使用ArrayList时进行类型检查。
从这一点上看来,ArrayList与数组的区别主要就是由于动态增容的效率问题了
3.ArrayList可以存任何Object,如String,Employee等,但不支持基本数据类型,除非使用wrapper。

数组的大小是固定的,不能在不破坏原有数据的前提下伸缩空间,也就是说数组可以伸缩空间,但是只是在原先的数组上重新实例化,原先的数组的数据将会被清空,通过System.Array.Resize这个泛型方法重置数组的空间大小,而集合却能随意伸缩空间且不破坏原先的数据。

创建数组的时候需要声明元素的类型,而集合类默认类型是Object,可以这样认为,数组是“进去难,出来简单”,而集合是“进去简单,出来难”。打比方我声明了一个Int类型的数组,也就是说这个数组只能存储整数类型的数据,如果我扔一个String类型的进去就报错,也就是不让我存进去,而集合不管是整数型的还是字符串型的全可以往里面扔,因为进去后的数据就会变成Object类型的了,但是取出来的时候必须按照先前存进去的类型进行拆箱,所以比较难,数组读取数据的速度比集合要快。

数组可读可写,却不能声明只读类型的数组,而集合却能通过 ReadOnly这个修饰符来达到只给读取数据,不给写入数据,这样在安全级别上提高了。

数组要有整数下标才能访问特定元素,而集合可以通过下标,也可以通过给定义的名字来访问,所以说作为读取数据的前提下,集合的灵活性比较高,而数组则在有些时候会很麻烦。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据