Java ArrayList 与 LinkedList性能对比

ArrayList是如何插入、删除数据的?

image.png

1.当插入一个data的时候会先检查数组是否需要扩容。

扩容的机制并不是说我需要添加N个数据 我就扩N个位置,而是有默认大小10个长度,当位置不够时通过位运算扩大1.5倍。因此当存放大量数据时,每次扩容都会消耗很多资源。
具体请参考(https://www.cnblogs.com/baichunyu/p/12965241.html

扩容代码.png

2.数据复制与赋值

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

将data后面的数据G、H、I进行复制并赋值到后面一位并将data赋值到指定位置


image.png

这样就完成了一次add,当我们插入的数据后面数据越多就会越消耗性能,越慢。删除也是同理。

LinkedList是如何插入、删除数据的?

LinkedList是典型的链表设计(双向链表)


链表设计图.png

每个数据都包含了本数据和上一个数据的指针与下一个数据的指针。

  • LinkedList.Node.class
    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

当你需要添加数据时,只需要将数据填入链表,并修改对应数据的指针既可以实现。

总结

由此可见,当需要插入数据时,LinkedList的性能是优于ArrayList的。
相反,当你需要查询数据的时候,ArrayList是更快的,因为ArrayList是数组,直接通过下标就可以访问到,而链表需要你循环找到位置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容