数组([]):最高效;但是其容量固定且无法动态改变; 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这个修饰符来达到只给读取数据,不给写入数据,这样在安全级别上提高了。
数组要有整数下标才能访问特定元素,而集合可以通过下标,也可以通过给定义的名字来访问,所以说作为读取数据的前提下,集合的灵活性比较高,而数组则在有些时候会很麻烦。