【Java基础】ArrayList和LinkedList的区别与联系

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循环遍历吗

你可能感兴趣的:(Java基础,java,开发语言,后端)