一、区别
1、底层数据结构不同,ArrayList底层是基于数组实现的,LinkedLis底层是基于链表实现的。
2、ArrayList更适合随机查找,LinkedList更适合删除和添加,查询、添加、删除的时间复杂度不同
3、ArrayList和LinkedList都实现了List接口,但是LinkedList还额外实现了Deque接口,所以LinkedList还可以当做队列使用
二、操作数据效率
ArrayList按照下标查询的时间复杂度O(1)【内存是连续的,根据寻址公式】,LinkedList不支持下标查询
查找(未知索引):ArrayList需要遍历,链表也遍历,时间复杂度都是O(n)
新增和删除
- ArrayList尾部插入和删除,时间复杂度是O(1);其他部分增删需要挪动数组,时间复杂度是O(n)
- LinkedList头尾节点增删时间复杂度是O(1),其他都需要遍历链表,时间复杂度是O(n)
三、内存占用空间
ArrayList底层是数组,内存连续,节省内存
LinkedList是双向链表需要存储数据,和两个指针,更占用内存
四、线程安全
ArrayList和LinkedList都不是线程安全的
如果需要保证线程安全,有两种方案:
- 在方法内使用,局部变量则是线程安全的
- 使用线程安全的ArrayList和LinkedList
List syncArrayList = Collections.synchronizedList(new ArrayList<>());
List syncLinkedList = Collections.syncronizedList(new LinkedList<>());