ArrayList和LinkedList的区别与联系
相同点:
1.两者都实现了List接口
2.两者都是线程不安全的
不同点:
1.从底层数据结构说
ArrayList的底层数据结构是动态数组,也就是数组
数组在内存中的存储结构是连续的
LinkedList的底层数据结构是双向链表
链表在内存中的存储结构式不连续的
2.从查询来说
ArrayList.get(index)时间复杂度为O(1),因为是直接从底层数组下标获取的
LinkedList.get(index)时间复杂度为O(n),因为需要遍历整个链表
3.从添加角度来说
ArrayList
add(E e)会默认将元素添加到数组末尾,不考虑扩容的情况下,时间复杂度为O(1)
add(index,E e)将新的元素插入到指定位置,时间复杂度为O(n),是先移动,在修改
LinkedList
add(index,E e)需要先遍历,在插入到指定位置,时间复杂度为O(n)
addFirst和addLast时间复杂度为O(1)
4.从删除的角度来说
ArrayList.remove(index)将指定位置上的元素删除,因为要移动底层数组,所以时间复杂度为O(n)
LinkedList.remove(index)将制定位置上的元素删除,因为要先遍历查找,时间复杂度为O(n)
5.从遍历的角度来说
ArrayList可以使用for循环遍历,也可以使用迭代器遍历
LinkedList可以使用for循环遍历,也可以使用迭代器遍历,但是LinkedList使用for循环遍历效率极低,因为for循环中每次get值都需要从链表同步或者尾部逐一遍历
1000 | 5000 | 10000 | 50000 | 100000 | |
ArrayList | 0ms | 1ms | 2ms | 3ms | 3ms |
LinkedList | 3ms | 16ms | 88ms | 2446ms | 18848ms |
注意事项
ArrayList的效率并不一定比LinkedList的插入效率低,当规定好合适的ArrayList大小,并采用尾插法插入数据,ArrayList可以极大的提高性能,甚至超过LinkedList
因为LinkedList的底层是双向链表,每插入一个数据会创建一个Node对象,并且还有额外的空间指向下一个节点和上一个节点,所以时间和空间的消耗也会较大
参考文章
膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili阿里面试官:说一下ArrayList和LinkedList的区别?_沉默王二-CSDN博客膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili
切勿用普通for循环遍历LinkedList_zhangyuan19880606的专栏-CSDN博客_linkedlist可以用for循环遍历吗