LinkedList的底层实现

 

public class LinkedList

    extends AbstractSequentialList

    implements List, Deque, Cloneable, java.io.Serializable

public interface Deque extends Queue

其实是双端队列

 

 

实现原理

List接口的链表实现,并提供了一些队列,栈,双端队列操作的方法

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;

        }

    }

ArrayList对比,LinkedList插入和删除操作更加高效,随机访问速度慢

可以作为栈、队列、双端队列数据结构使用;

非同步,线程不安全;

ArrayList、Vector一样,LinkedList的内部迭代器存在“快速失败行为”;

支持null元素、有顺序、元素可以重复

 

实现的Deque接口

双端队列

双端队列是指允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构。将队列的两端分别称为前端和后端,两端都可以入队和出队。

 

 

其实是间接实现Queue接口

主要的方法:

boolean offer(E e);

将对象e插入队列尾部,成功返回true,失败(没有空间)返回false;

E poll();

获取并移除队列头部元素,如果队列为空,返回null;

E peek();

获取但不移除队列头部元素,如果队列为空,返回null;

boolean offerFirst(E e);

将对象e插入到双端队列头部

boolean offerLast(E e);

将对象e插入到双端队列尾部;

 

Poll出队方法操作

public E poll() {

        final Node f = first;

        return (f == null) ? null : unlinkFirst(f);

    }

private E unlinkFirst(Node f) {

        // assert f == first && f != null;

        final E element = f.item;

        final Node next = f.next;

        f.item = null;

        f.next = null; // help GC

        first = next;

        if (next == null)

            last = null;

        else

            next.prev = null;

        size--;

        modCount++;

        return element;

    }

主要实现在unlinkFirst方法内,首先直接获取被删节点,临时存储其具体引用的对象element和下个引用next,然后将被删节点对象引用和下个节点引用置null给gc回收,改变双端队列队头结点为被删节点的下个引用next,如果next为空,将双端队列的队尾结点last置null,否则将next节点的前引用置null;队列长度减减,操作次数加加(快速失败机制,参考HashMap),返回被删节点引用的具体对象

 

 

你可能感兴趣的:(JavaSE集合类)