JDK源码(1.7) -- java.util.Deque<E>
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>的更多相关文章
- JDK源码(1.7) -- java.util.Collection<E>
java.util.Collection<E> 源码分析(JDK1.7) -------------------------------------------------------- ...
- JDK源码学习之 java.util.concurrent.automic包
一.概述 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CP ...
- JDK源码(1.7) -- java.util.Queue<E>
java.util.Queue<E> 源码分析(JDK1.7) -------------------------------------------------------------- ...
- JDK源码(1.7) -- java.util.Arrays
java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...
- JDK源码(1.7) -- java.util.AbstractList<E>
java.util.AbstractList<E> 源码分析(JDK1.7) ------------------------------------------------------- ...
- JDK源码(1.7) -- java.util.ListIterator<E>
java.util.ListIterator<E> 源码分析(JDK1.7) ------------------------------------------------------- ...
- JDK源码(1.7) -- java.util.Iterator<E>
java.util.Iterator<E> 源码分析(JDK1.7) ----------------------------------------------------------- ...
- JDK源码(1.7) -- java.util.List<E>
java.util.List<E> 源码分析(JDK1.7) --------------------------------------------------------------- ...
- JDK源码(1.7) -- java.util.AbstractCollection<E>
java.util.AbstractCollection<E> 源码分析(JDK1.7) ------------------------------------------------- ...
随机推荐
- 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享
今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...
- JSOI 2017 退役记
意料之中,真的要退役了. 懒得写游记了. Round 2 的时候状态一直不太清醒,最后混了个rank19,准备AFO吧.
- gdb安装
1.卸载原有gdb 以root用户登录 1.1 查询原有gdb包名,执行命令: rpm -q gdb 1.2 卸载原有gdb包,假设gdb包名为gdb-7.0-0.4.16,执行命令:rpm - ...
- 正排索引(forward index)与倒排索引(inverted index) (转)
一.正排索引(前向索引) 正排索引也称为"前向索引".它是创建倒排索引的基础,具有以下字段. (1)LocalId字段(表中简称"Lid"):表示一个文档的局部 ...
- 在数据库中(Oracle),根据时间查询数据: to_date()和to_char()函数
1. to_date() 函数 1.1 格式 to_date("要转换的字符串","转换的格式") //两个参数的格式必须匹配,否则会报错.即按照第二个参数 ...
- fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s",name); buff为字符数组
fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s" ...
- mysql一个字符问题
顺便记录一下在使用mysql过程中碰到的一些问题: 有时候使用脚本迁移数据时会碰到乱码的问题,即使将表字符集设置成utf8也无济于事,这个时候在执行sql之前加一句set names utf8即可.
- IntelliJ IDEA 创建maven项目一次后,然后删除,再次保存到此目录下,提供此目录已经被占用的问题。
-------------------2017-02-14补充: 你看既然是创建过一次 不允许再次创建了,那么请问 第一次创建的 跑哪里去了,不仅仅是保存到了你指定的目录里,其实也默认安装到了 mav ...
- mac os版本Intellij IDEA 搭建spring mvc的maven工程(新手教学)
由于近期换了新公司,又换mac pro作为新电脑,打算把用了很多年的eclipse换成IDEA(IDEA比eclipse的好处我就不多说了),由于mac os和IDEA刚开始用不久,所以专门用一篇博客 ...
- 初涉yield
function* a(i) { console.log('here we go'); yield i; // 必须有*,不然b会作为返回值,而不是执行 yield* b(i); yield i+10 ...