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。