java集合类(三)List之LinkedList

LinkedList概述

  LinkedList是基于链表的list,与C++中的链表是相同的,它是一个双向链表。先来看下LinkedList的定义:

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

LinkedList 实现了 List 接口,所以他具有List的所有操作。
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。

底层存储

    //链表的头结点
    transient Node<E> first;

    //链表的尾结点
    transient Node<E> last;

下面来看下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;
        }
    }

每个结点都存储了prev结点和next结点。这样就使得所有的元素结点链接起来。
仔细看了下源码,增删操作与C++中链表的操作一致。这里我们只简单介绍下add操作,其他操作就不在这里赘述了。

   public boolean add(E e) {
        linkLast(e);
        return true;
    }
    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++;
    }

  add操作即在链表尾部添加一个元素,看下上面linkLast的源码很容易理解,首先new一个Node结点,他的prev结点是原先的last结点,然后再将原来的last结点的next结点设置为当前new出来的结点。显然当第一次进行此操作时,firstlast结点都为null,此时插入的新节点即是first结点也是last结点。
  我们可以看到这里也有一个modCount字段,他的作用和ArrayList中是一样的。

由于LinkedList与C++链表的操作时一样的,所以LinkedList就简单介绍一下。下一篇我们主要介绍一下LinkedList与ArrayList的区别。

你可能感兴趣的:(java,LinkedList)