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的區別。
發佈了35 篇原創文章 · 獲贊 58 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章