JDK1.8 LinkedList双向链表

序言

LinkedList是一个双向链表

也就是说list中的每个元素,在存储自身值之外,还 额外存储了其前一个和后一个元素的地址,所以也就可以很方便地根据当前元素获取到其前后的元素

链表的尾部元素的后一个节点是链表的头节点;而链表的头结点前一个节点则是则是链表的尾节点(是不是有点像贪吃蛇最后 头吃到自己尾巴的样子,脑补下)

既然是一个双向链表,那么必然有一个基本的存储单元,让我们来看LinkedList的最基础的存储单元。

源码

Node

 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;
        }
    }
linkFirst
private void linkFirst(E e) {
        final Node<E> f = first;
        final Node<E> newNode = new Node<>(null, e, f);
        first = newNode;
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;
        size++;
        modCount++;
    }

总结

  • LinkedList内部使用链表实现,相比于ArrayList更加耗费空间。
  • LinkedList插入,删除节点不用大量copy原来元素,效率更高。
  • LinkedList查找元素使用遍历,效率一般。
  • LinkedList同时是双向队列的实现。

资料

List之LinkedList源码实现

https://www.jianshu.com/p/820dd2fec5e8

原文地址:https://www.cnblogs.com/cnki/p/10669681.html