LinkedList集合源码解析

LinkedList集合源码解析

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{
    ......
    }

LinkedList是基于双向链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈、队列和双端队列来使用。

LinkedList同样是非线程安全的,只在单线程下适合使用。

LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆。

/ 双向链表的节点所对应的数据结构。    
    // 包含3部分:上一节点,下一节点,当前节点值。  
 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;
        }
    }
    
    
     /**
     * 把e作为头节点
     */
    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++;
    }

    /**
     * 把e做为尾节点
     */
    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++;
    }

可以看出在1.7中LinkList是双向链表,但不是循环链表(这是在1.6上的变化)

  • 不是循环链表,有以下好处
  1. first / last有更清晰的链头、链尾概念,代码看起来更容易明白。
  2. first / last方式能节省new一个headerEntry。(实例化headerEntry是为了让后面的方法更加统一,否则会多很多header的空校验)
  3. 在链头/尾进行插入/删除操作,first /last方式更加快捷。

在查找和删除某元素时,源码中都划分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null

LinkedList是基于链表实现的,因此不存在容量不足的问题,所以这里没有扩容的方法

LinkedList同样也实现了ListIterator,可以在迭代过程中进行修改

反向迭代器descendingIterator

LinkedList list=new LinkedList();
        list.add(1);
        list.add(2);
        list.add(3);
        //System.out.println(list.getLast());
        Iterator it=list.descendingIterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        
        //输出:3,2,1

你可能感兴趣的:(源码,集合,LinkedList)