基于 jdk1.8分析linkedList集合的源码分析

1:linkedList集合中的底层数据结构为双向链表这样一个结构,在源码中具体是以内部类Node表示的,我们可以在LinkedList中看下Node的属性组成

/**
其中item代表为当前节点值,prev代表前一个节点,next代表后面的节点
/
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;
        }
    }
   
   
  /**在类的修饰词上面我们能够看见该类继承了AbstractSequentialList类,以及实现了List接口
    public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable  
    
    
//记录链表节点数   
transient int size = 0;

//链表的第一个节点
transient Node<E> first;

//链表的最后一个节点
transient Node<E> last;


/**
相等于在链头添加第一个节点,这里面的逻辑new  node对象前面的节点为null,后面的节点为first ,然后将新建的节点赋值给first,然后再判断后一个节点是否为null,如果为null,代表既是第一个节点也是最后一个节点,如果不是f的prev就是新建的这个节点,同时记录size以及fast-fail记录
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++;
    }
    
 //linkLast源码里面的代码逻辑也是同理的
 void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }
    
/**
将e插入到succ节点的前面,这里面的代码逻辑就是首先取出要插入前面的前一个节点,然后new  Node,在以要插入的前一个节点,然后在更新要插入的节点位置上判断前面节点是否为null值没如果为null,就赋值为first节点,同时记录数量
void linkBefore(E e, Node<E> succ) {
        // assert succ != null;
        final Node<E> pred = succ.prev;
        final Node<E> newNode = new Node<>(pred, e, succ);
        succ.prev = newNode;
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        size++;
        modCount++;
    }
    
/**
将它的Node对象三个节点全部设置为null值
判断前一个节点是否为null,如果是那么就
E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;

        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }
    
   /**
   在删除的时候我们能够看见就是调用了unlink方法
     public E removeFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return unlinkFirst(f);
    }
发布了51 篇原创文章 · 获赞 0 · 访问量 761

猜你喜欢

转载自blog.csdn.net/a_liuren/article/details/103553495