public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable |
public interface Deque<E> extends Queue<E> 其实是双端队列 |
实现原理
List接口的链表实现,并提供了一些队列,栈,双端队列操作的方法
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; } } |
与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<E> f = first; return (f == null) ? null : unlinkFirst(f); } |
private E unlinkFirst(Node<E> f) { // assert f == first && f != null; final E element = f.item; final Node<E> 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),返回被删节点引用的具体对象 |