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的区别?_沉默王二-优快云博客膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili
切勿用普通for循环遍历LinkedList_zhangyuan19880606的专栏-优快云博客_linkedlist可以用for循环遍历吗
本文详细分析了ArrayList和LinkedList在Java中的区别与联系,包括它们的底层数据结构、查询效率、添加与删除操作的时间复杂度以及遍历方式。在查询速度上,ArrayList优于LinkedList;而插入与删除操作,LinkedList在特定情况下更具优势。对于遍历,LinkedList使用for循环效率较低。注意,预设合适大小的ArrayList并采用尾插法能提高性能。选择使用哪种集合类型取决于具体应用场景。
2341

被折叠的 条评论
为什么被折叠?



