ArrayList、Vector、LinkedList的区别

1.底层数据结构:

  ArrayList  底层实现是动态数组

  Vector   底层实现是动态数组

  LinkedList  底层实现是双链表  

 2.扩容机制:

  ArrayList    底层是动态数组存在扩容说法,默认的数组大小是10,在检测是否需要扩容后,如果扩容,会扩容为原来的1.5倍大小。原理就是把老数组的元素存储到新数组里面。

  Vector     底层是动态数组存在扩容说法,默认的数组大小是10,在检测是否需要扩容后,如果扩容,会扩容为原来的2倍大小。原理就是把老数组的元素存储到新数组里面。

  LinkedList    不存在扩容的说法,因为是链表结构。 

3.线程安全:

  ArrayList  在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题,如果要使ArrayList是线程安全的,那么可以选择使用Collections.synchronizedList(new ArrayList())

  Vector      是线程安全的,即它大部分的方法都包含关键字synchronized,但是Vector的效率没有ArraykList和LinkedList高

  LinkedList   在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题,如果要使LinkedList是线程安全的,那么可以选择使用Collections.synchronizedList(new LinkedList())

4.插入和删除:

  ArrayList  因为是一块连续的内存存储数据元素,所以如果要删除或者插入一个元素,那么之前或者之后的元素都要移动,代价很高。

  Vector      这点和ArrayList相同。

  LinkedList   底层是双链表,对于插入或者删除元素来说,操作方便,性能高。

 5.查找:

  ArrayList  查找性能好,因为底层是数组,适用于查找元素。

  Vector      这点和ArrayList相同。

  LinkedList   是双链表,在内存中可以是不连续的,通过指针连接结点,如果要查找元素,必须去遍历整个链表,这样就比较麻烦。

6.内存空间占用:

  ArrayList  空间浪费主要体现在list列表的结尾会预留一定的容量空间。

  Vector      这点和ArrayList相同。

  LinkedList   花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

总结:

线程安全: Vector线程安全但是性能低,因此在不需要保证线程安全时建议使用Arraylist而不是Vector;

查找:   Arraylist性能高于LinkedList。

添加和删除:LinkedList性能高于Arraylist。

 

原文地址:https://www.cnblogs.com/yuki67/p/12073677.html