Java中ArrarList和LinkedList区别

108 阅读1分钟

一、区别

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<>());