关于LinkedList

LinkedList实现了List接口与Deque接口。Deque解开意思是“Double End Queue”(双端队列),这个队列定义了2端可以插入或者删除元素,可以实现为无容量限制的队列,也可以实现为有容量限制的队列,LinkedList采用的有容量限制的实现,最大容量为Integer.MAX_VALUE。

public class LinkedList
    extends AbstractSequentialList
    implements List, Deque, Cloneable, java.io.Serializable
{
    //长度
    transient int size = 0;
    //指向头结点
    transient Node first;
    //指向尾结点
    transient Node last;

  private static class Node {
    //元素
    E item;
    //指向后一个元素的指针
    Node next;
    //指向前一个元素的指针
    Node prev;

    Node(Node prev, E element, Node next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
  }
}

Node是一个静态内部类。Node代表链表基本数据元素,封装了数据本身和两端指针。

有限容量的链表实现Node定位有段代码比通常的思路好一些,通过判断index靠近头还是尾,再遍历:

Node node(int index) {
    // assert isElementIndex(index);
    if (index < (size >> 1)) {
        Node x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
        return x;
    } else {
        Node x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}

比较LinkedList和ArrayList
相同点:

  1. 接口实现:都实现了List接口,都是线性列表的实现
  2. 线程安全:都是线程不安全的

不同点:

  1. 底层实现,ArrayList是数组,而LinkedList是双向链表
  2. 接口实现,ArrayList实现了RandomAccess支持随机节点快速访问,LinkedList实现了Deque,可以作为队列使用。
  3. 性能:新增、删除元素时ArrayList需要使用到拷贝原数组,而LinkedList只需移动指针;查找元素 ArrayList支持随机元素访问,而LinkedList只能一个节点的去遍历。简要来说,ArrayList适合查找,LinkedList适合增删。(如果ArrayList增删只考虑从末尾操作,那么就无需移动数组,速度反而会异常的快。)

参考文章:
Java容器之LinkedList

你可能感兴趣的:(关于LinkedList)