ArrayList、LinkedList、Vector的区别

Java集合框架继承关系图
Java集合框架继承关系图
1. ArrayList

底层是依据动态数组实现的,它允许所有元素,包括null。ArrayList没有同步,线程不安全。

数组是连续的内存空间,在数组的任意位置插入(删除)元素,必然导致该位置及其后所有元素要重新排列(数组复制),所以如果处理大量数据且插入(删除)元素的位置越靠前,性能影响就越大。

但是数组可以直接通过查找序号(下标)索引元素,非常快。

2. LinkList

底层是依据双向循环链表实现的。LinkList没有同步,线程不安全。

双向循环链表将每个对象存在独立的节点中,每个节点还存放着序列中上一个节点的引用和下一个节点的引用,所以从链表中插入(删除)操作起来还是很轻松的,只需要对附近节点更新一下就可以了。但是索引的话,指针需要一步步的移动,性能自然受到影响。


3. Vector

Vector非常类似ArrayList,但是Vector是同步的,线程安全。

Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。

从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。

4. 总结

如果你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的,O(1),但它在索引一个元素的使用却比较慢-O(i),其中i是索引的位置。

相对来说:
在这里插入图片描述