1.空间大小
array是不可变的,必须事先控制其大小。arraylist是可扩容数组,每次扩大容量的0.5倍。
2.存放内容
array只能存放相同类型的元素,但存放对象可以是基本类型或者对象类型
arraylist可以存放不同类型的元素(object),但存放对象只能是对象类型,而且如果加上<>的话,就是指定类型了。
3.使用方法
arraylist在array的基础上增加了例如addall(),removeall(),iterator()等常用方法。注意:我们经常需要在遍历元素的同时对数组中的元素进行增删改,此时如果array的话,用增强for循环没有办法删除的,只能用普通for循环进行遍历,但是不能删除,因为数组长度是固定的,只能将对应的索引的值变化一下,等循环结束之后赋值给新数组。
而arraylist在普通for循环的时候,如果调用list.remove,会自动进行元素删除以及arrys.copyof方法(也就是新数组生成),所以如果边循环边删除的时候会出现一个问题,第一个问题是,被删除的相邻元素其实不会被访问到,被直接跳过了。
arraylist在增强for循环或者foreach中,其实都是在使用迭代器方法,但是他们只是查询用迭代器,并没有使用迭代器的删除方法(iterator.remove()),会出现只有modCount增加了,但是expectedModCount却没有变化,所以在进行list.remove()操作的时候,会在modCount==expectedModCount处出现错误,导致出现ConcurrentModificationException异常。
但是arrylist在用迭代器进行遍历并且进行删除的时候就不会出错,为什么呢,因为你会发现你在迭代器里面用的是 iterator.remove() ,去源码里面看你会发现,迭代器在使用list本身的删除方法之外(list.remove()),还让modCount==expectedModCount,这就使得两个变量一致了,再进行删除的时候,就不会报异常了。
4.应用场景
如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就可以选择ArrayList。
而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。