Vector vs ArrayList vs LinkedList
一.简介
三者都实现了List接口,用法差不多,主要的区别在于它们对于不同操作的操作速度不同。
ArrayList是可以改变大小的数组。当有元素添加到ArrayList中去时,它的大小动态的增加。元素可以直接通过get()和set()方法进行访问,因此ArrayList实际上是数组。
LinkedList是个双向链表。它的add()和remove()方法比ArrayList快,但是get()和set()方法却比ArrayList慢。
Vector和ArrayList类似,但是Vector是同步的。如果在线程安全的环境下,使用ArrayList是更好的选择。添加元素的时候,当超过初始容量的时候,Vector和ArrayList需要更多的空间:Vector需要将数组的大小增加一倍,而ArrayList需要增加50%。
LinkedList还实现了Queue接口,这样就比ArrayList和Vector多出了一些方法如offer(), peek(), poll()等。
注意:ArrayList的初始容量(initial capacity)很小。我们应该设置一个比较大的初始容量,这样可以避免重新改变大小。
二. ArrayList vs Vector
相同点:
1.都是基于Object数组实现的。
2.都允许添加null元素。
不同点:
1.ArrayList不是线程安全的,Vector是线程安全的(方法是Synchronized的)。
2.ArrayList扩容后容量变为之前的1.5倍,Vector扩容后容量是之前的2倍,故ArrayList更省空间。
二.ArrayList vs LinkedList的性能比较
相同点:
都允许添加null元素。
不同点:
1.对于随机访问get和set,ArrayList比LinkedList快。
2.对于插入和删除操作,LinkedList比较快。
特点:
ArrayList的缺点:添加或删除一个元素需要移动数组中的其它元素。
LinkedList的缺点:获取一个元素时需要遍历链表(根据下标来决定是遍历链表的前半部分[从头节点遍历]还是遍历链表的后半部分[从尾节点遍历])。
结论:
从时间复杂度来说:如果对list增加或删除操作较多,则建议使用LinkedList;如果对list查询操作较多,则建议使用ArrayList。
从空间复杂度来说:LinkedList占用的空间较多(链表中的每一个节点都需要两个引用来指向它的previous节点和next节点)。
ArrayList对于任意索引的插入/删除操作的时间复杂度是O(n),而在列表的尾部的操作时间为O(1)。
LinkedList对于任意索引的插入/删除操作的时间复杂度是O(n),而在列表的头部或尾部的操作时间为O(1)。
Arrays:
- 找到插入/删除位置的时间复杂度是O(1)
- 进行插入/删除操作的时间复杂度是O(n)
LinkedList:
- 找到插入/删除位置的时间复杂度是O(n)
- 进行插入/删除操作的时间复杂度是O(1)
它们的性能的差别很显著。LinkedList对于add()和remove()相对于ArrayList要快,但是get()要慢些。按照复杂度以及测试结果来看,我们很容易知道什么时候该使用ArrayList,什么时候该使用LinkedList。简而言之,下面的情况该使用LinkedList:
- 如果没有大量的随机访问
- 如果有很多add/remove的操作