一、同步性
- ArrayList和LinkedList是不同步的,而Vector是同步,也就是说ArrayList和LinkedList是线程不安全的,但是可以为节省同步而耗费的开销,而Vector是线程安全的,在多线程下,或许会使用到Vector,当然也可以使用Synchronized来实现同步,但是这样会使效率低下。
二、数据增长
- 从内部实现机制来讲,ArrayList和Vector都是使用Object的数组形式来存储,当向着两种类型增加元素时,如果元素的数目超出了内部数组的长度,那么额就需要扩展内部数组的长度,Vector缺省情况下,自动增长为原来的一倍,而ArrayList增长为原来的一半,所以最后获得的集合长度所占的空间总是比实际需要要大。所以如果要在集合中存放大量的数据,使用Vector比较有优势些,因为可以通过设置集合初始化大小避免不必要的资源开销。
- ArrayList继承List接口,其大小可变数组的实现,实现了所有可选列表操作,并允许包括null在内的所有元素。每个ArrayList实例都有一个容量,该容量用来表示存储列表元素的数组大小,如果==List list = new ArrayList<>(CAPACITY_SIZE)==,那么默认容量是10;当ArrayList的元素超过10个元素以后,会重新分配空间,增长趋势是:10——>16——>25——>38——>58….如果List list = new ArrayList(4),,那么默认容量表示的是4,当超过时,增长变化为4——>7——>11——>17…..可见起变化公式为((旧容量*3)/2)+1。ArrayList的列表对象实质是存储在一个引用型数组里,但是该数组不能自动增长来自动改变size大小,实际上他只是改变了该引用型数组的指向而已。
- Vector容量会直接增加原来的1倍。
三、检索、插入、删除对象的效率
- ArrayList和Vector中,从指定的位置检索一个对象,或在集合末尾插入、删除一个对象的时间复杂度为O(1)。但是,如果在集合其他位置增加或移除元素,那么花费的时间复杂度为O(n-i),其n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。原因是在插入或删除每个元素时,该元素之后的元素都要执行(n-i)个对象的位移操作。
- LinkedList实质是基于链表的数据结构,在任何插入、删除集合中的元素所花费的时间复杂度都是一样的,即O(1),在索引一个元素时,时间相对于比较慢。
- ArrayList和LinkedList的区别总结如下:
-
- ArrayList内部实现是一个数组,基于动态数组的数据结构,数组前后插入性能好,但是如果在中间插入值,则需要把插入位置之后的值全部进行为操作,这就使得效率低下,而LinkedList是基于双向链表的数据结构,随机位置插入或删除数据,其效率都是一样的,因此如果频繁地插入或删除数据,那么选择LinkedList就比较合适。
-
- 对于数据的访问get和set操作,ArrayList占优势,因为LinkedList需要移动指针。
-
- 对于元素的遍历操作,效率比较如下: