ArrayList和LinkedList的区别是什么?(高频)
1. 底层数据结构
● ArrayList是动态数组的数据结构实现
● LinkedList 是双向链表的数据结构实现
2.操作数据效率
● ArrayList按照下标查询的时间复杂度O(1)【内存是连续的,根据寻址公式】,LinkedList不支持下标查询
●查找(未知索引):ArrayList需要遍历,链表也需要链表,时间复杂度都是O(n)
● 新增和删除
(1) ArrayList尾部插入和删除,时间复杂度是O(1);其他部分增删需要挪动数组,时间复杂度是O(n)
(2) LinkedList头尾节点增删时间复杂度是O(1),其他都需要遍历链表,时间复杂度是O(n)
3. 内存空间占用
● ArrayList底层是数组,内存连续,节省内存
● LinkedList是双向链表需要存储数据,和两个指针,更占用内存
4. 线程安全
● ArrayList和LinkedList都不是线程安全的
● 如果需要保证线程安全,有两种方案:
● 在方法内使用,局部变量则是线程安全的
● 使用线程安全的ArrayList和LinkedList
List<Object> syncArrayList = Collections.synchronizedList(new ArrayList<>());
List<Object> syncLinkedList = Collections.synchronizedList(new LinkedList<>());