Java ArrayList 与 LinkedList性能对比

151 阅读1分钟

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

19314653-fc8465124d64a838.png

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

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

19314653-8e069101075cdb93.png

2.数据复制与赋值

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

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

image.png

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

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

LinkedList是典型的链表设计(双向链表) 19314653-6879c0bc7c5997e7.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是数组,直接通过下标就可以访问到,而链表需要你循环找到位置。

反复插入、删除数据时,如何优化时间复杂度。