ArrayList
数组,按照索引下标访问速度快O(1),但是当删除添加元素时会导致元素的移动,速度慢O(n) LinkedList
双向链表,按照索引下标访问速度慢O(n),但是删除添加元素速度快O(1)
Vector
数组,按照索引下标访问速度快O(1),但是当删除添加元素时会导致元素的移动,速度慢O(n)
ArrayList
不同步,线程不安全,但是并发高,访问效率高
LinkedList
不同步,线程不安全,但是并发高,访问效率高 o
Vector
同步,所以线程安全,但是并发低,访问效率低 |
ArrayList
经常需要快速访问,较少在中间增加删除元素时使用;如果多线程访问,则需要自行编程解决线程安全问题
LinkedList
经常需要在内部增删元素,但是很少需要通过索引快速访问时使用;如果多线程访问,则需要自行编程解决线程安全问题
Vector
一般不使用,如果在多线程访问时可以考虑使用
相同点:都实现List接口,存储数据的特点相同,存储有序的,可重复的数据
不同点:
ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全),底层使用Object[] elementData(具体存放数据的数组)存储,从查找的时间复杂度来说它属于O(1)。删除元素的时间复杂度O(n)。Java中的数组是定长的,如果需要变长则需要自行编程实现
LinkedList:双向链表实现,增删快,查询慢 (线程不安全),具体的底层内部实现为双向链表;当然它的效率比ArrayList高,所以它的线程安全程度比ArrayList更低;从查找的时间复杂度来说属于O(n)。插入删除的时间复杂度属于O(1)。
Vector:数组实现,重量级 (线程安全、使用少),具体实现为数组数据访问0(1),增删可能会导致一半以上
如何选用
1、当查找操作比较多时,使用ArrayList,因为其底层是数组实现,可以根据脚标查找,时间复杂度是O(1),
而LinkedList底层是双向链表,查找起来还要遍历,其时间复杂度是O(n)。
2、当插入,删除操作比较多时,使用LinkedList,其只需要修改pre和last指针即可,时间复杂度为O(1),
而ArrayList还要遍历数组,时间复杂度为O(n)。