java.util.Deque<E> 源码分析(JDK1.7)

---------------------------------------------------------------------------------

java.util.Deque<E>是一个接口,它的定义如下:

 public interface Deque<E> extends Queue<E> {
//Modify methods
//Queue methods
//Stack methods
//Collection methods
}

(1)java.util.Deque<E>是一个线性collection,支持在两端插入和移除元素。(名称deque是"double ended queue" 双端队列)。

(2)java.util.Deque<E>接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

(3)java.util.Deque<E>接口定义在双端队列访问元素的方法,提供插入、移除、检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常;另一种形式返回一个特殊值(null或false)。

下表总结了上述说的插入、移除、检查方法:

  第一个元素(头部) 最后一个元素(尾部)
  抛出异常 特殊值 抛出异常 特殊值
插入 addFirst(e) offerFirst(e) addLast(e) offerLast(e)
移除 removeFirst() pollFirst() removeLast() pollLast()
检查 getFirst() peekFirst() getLast() peekLast()

(4)java.util.Deque<E>接口扩展了java.util.Queue<E>接口,在将双端队列用作队列时,将得到FIFO行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从java.util.Queue<E>接口继承的方法完全等效于java.util.Deque<E>方法,如下表:

Queue方法 等效Deque方法
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()

(5)双端队列也可以用作LIFO(先进先出)堆栈。(PS:如果要使用堆栈功能,应该优先使用此接口而不是遗留的java.util.Stack类)在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列的开头弹出,堆栈方法完全等效于Deque方法,如下表:

堆栈方法 等效Deque方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()

下面来看一副图:

----------------------------------------------------------------------------------------

下面来看看java.util.Deque<E>中具体有哪些方法:

头、尾元素操作 void addFirst(E e) 将指定元素插入此双端队列的开头
void addLast(E e) 将指定元素插入此双端队列的末尾
boolean offerFirst(E e) 将指定的元素插入此双端队列的开头
boolean offerLast(E e) 将指定的元素插入此双端队列的末尾
E removeFirst() 获取并移除此双端队列第一个元素
E removeLast() 获取并移除此双端队列的最后一个元素
E pollFirst() 获取并移除此双端队列的第一个元素;如果此双端队列为空,则返回 null
E pollLast(); 获取并移除此双端队列的最后一个元素;如果此双端队列为空,则返回 null
E getFirst() 获取,但不移除此双端队列的第一个元素
E getLast() 获取,但不移除此双端队列的最后一个元素
E peekFirst() 获取,但不移除此双端队列的第一个元素
E peekLast() 获取,但不移除此双端队列的最后一个元素
boolean removeFirstOccurrence(Object o) 从此双端队列移除第一次出现的指定元素
boolean removeLastOccurrence(Object o)   从此双端队列移除最后一次出现的指定元素
队列操作 boolean add(E e) 将指定元素插入此双端队列所表示的队列
boolean offer(E e) 将指定元素插入此双端队列所表示的队列
E remove() 获取并移除此双端队列所表示的队列的头部
E poll() 获取并移除此双端队列所表示的队列的头部
E element() 获取,但不移除此双端队列所表示的队列的头部
E peek() 获取,但不移除此双端队列所表示的队列的头部
堆栈操作 void push(E e) 将一个元素推入此双端队列所表示的堆栈
E pop() 从此双端队列所表示的堆栈中弹出一个元素
集合操作 boolean remove(Object o) 从此双端队列中移除第一次出现的指定元素
boolean contains(Object o) 如果此双端队列包含指定元素,则返回 true
public int size() 返回此双端队列的元素数
Iterator<E> iterator() 返回以恰当顺序在此双端队列的元素上进行迭代的迭代器
Iterator<E> descendingIterator() 返回以逆向顺序在此双端队列的元素上进行迭代的迭代器

----------------------------------------------------------------------------------------

java.util.Deque<E>源码如下:(看看下面的源码,定义的很规范,各种操作都有-----> 此时应该想到它的实现类该有多可怜,要实现多少方法呀。~_~)

 package java.util;

 public interface Deque<E> extends Queue<E> {
/*head、tail operation methods*/
void addFirst(E e);
void addLast(E e); boolean offerFirst(E e);
boolean offerLast(E e); E removeFirst();
E removeLast(); E pollFirst();
E pollLast(); E getFirst();
E getLast(); E peekFirst();
E peekLast(); boolean removeFirstOccurrence(Object o);
boolean removeLastOccurrence(Object o); // *** Queue methods ***
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek(); // *** Stack methods ***
void push(E e);
E pop(); // *** Collection methods ***
boolean remove(Object o);
boolean contains(Object o);
public int size();
Iterator<E> iterator();
Iterator<E> descendingIterator();
}

JDK源码(1.7) -- java.util.Deque<E>的更多相关文章

  1. JDK源码(1.7) -- java.util.Collection<E>

     java.util.Collection<E> 源码分析(JDK1.7) -------------------------------------------------------- ...

  2. JDK源码学习之 java.util.concurrent.automic包

    一.概述 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CP ...

  3. JDK源码(1.7) -- java.util.Queue<E>

    java.util.Queue<E> 源码分析(JDK1.7) -------------------------------------------------------------- ...

  4. JDK源码(1.7) -- java.util.Arrays

    java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...

  5. JDK源码(1.7) -- java.util.AbstractList<E>

    java.util.AbstractList<E> 源码分析(JDK1.7) ------------------------------------------------------- ...

  6. JDK源码(1.7) -- java.util.ListIterator<E>

    java.util.ListIterator<E> 源码分析(JDK1.7) ------------------------------------------------------- ...

  7. JDK源码(1.7) -- java.util.Iterator<E>

    java.util.Iterator<E> 源码分析(JDK1.7) ----------------------------------------------------------- ...

  8. JDK源码(1.7) -- java.util.List<E>

    java.util.List<E> 源码分析(JDK1.7) --------------------------------------------------------------- ...

  9. JDK源码(1.7) -- java.util.AbstractCollection<E>

    java.util.AbstractCollection<E> 源码分析(JDK1.7) ------------------------------------------------- ...

随机推荐

  1. Attention is all you need 论文详解(转)

    一.背景 自从Attention机制在提出之后,加入Attention的Seq2Seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型.传统的基于R ...

  2. JSON.stringify()——JS转JSON字符串

    JSON.stringify() JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符 ...

  3. 在shell中如何判断字符串是否为有效的IP地址【转】

    转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...

  4. html---规范、细节积累-01

    语义错误 块级元素可以包含内联元素和某些块级元素,内联元素不能包含块级元素,只能包含内联元素 页面可能正常解析,但不符合语义.浏览器自带容错机制,对于不规范的写法也能够正确解析,各浏览器的容错机制不同 ...

  5. 003iptables 命令介绍

    http://www.cnblogs.com/wangkangluo1/archive/2012/04/19/2457072.html iptables 防火墙可以用于创建过滤(filter)与NAT ...

  6. JavaScript中的数据类型总结

    Javascript是一种弱类型语言,没有明确的类型分类:网上分类的方式比较多,个人感觉不比去特别的追究细分是什么什么类型,若是能够明确的分出类型的话,javascript就不是弱类型语言,又由于大家 ...

  7. Python写网络爬虫爬取腾讯新闻内容

    最近学了一段时间的Python,想写个爬虫,去网上找了找,然后参考了一下自己写了一个爬取给定页面的爬虫. Python的第三方库特别强大,提供了两个比较强大的库,一个requests, 另外一个Bea ...

  8. 面试题32:从1到n整数中1出现的次数

    这是一道广为流传的google面试题.用最直观的方法求解并不是很难,但遗憾的是效率不是很高:而要得出一个效率较高的算法,需要比较强的分析能力,并不是件很容易的事情.当然,google的面试题中简单的也 ...

  9. RSA私钥和公钥文件格式 (pkcs#1, pkcs#8, pkcs#12, pem)

    RSA私钥和公钥文件格式 (pkcs#1, pkcs#8, pkcs#12, pem) 2018年03月07日 11:57:22 阅读数:674 Format Name Description PKC ...

  10. 【WPF】Behavior的使用

    如何将一个行为附加到某个元素上呢?我们可以通过自定义一个Behavior! 我们首先看一下IAttachedObject接口,Behavior默认继承之这个接口 // 摘要: // 供可以附加到另一个 ...