一、描述

队列Queue这种数据结构,通常指先进先出(FIFO)这种容器。可以模拟生活中依次排队这种场景。

下面是集合体系继承树:

二、Queue

Queue和List一样都是Collection的子接口。

Queue源码定义:

public interface Queue<E> extends Collection<E> {
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
}
  • add(E e)/offer(E e) 将指定元素加入到队列尾部
  • remove() 返回队列头部元素并删除,如果队列为空,会抛NoSuchElementException
  • poll() 返回队列头部元素并删除,如果队列为空,返回null
  • element() 返回队列头部元素不删除,如果队列为空,会抛NoSuchElementException
  • peek() 返回队列头部元素不删除,如果队列为空,返回null

Queue的实现有PriorityQueue、ArrayDeque、LinkedList。其中ArrayDeque、LinkedList是实现的其子接口Deque。

三、Deque

从上面的继承图可以清楚的看到,Deque是Queue的子接口,它不仅是队列的数据结构,也是一个双端队列数据结构,同时也是一个栈(stack)的数据结构。

Deque源码定义:

public interface Deque<E> extends Queue<E> {
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(); }

Deque的接口和上面的Queue的操作基本相同。xxxFirst操作队列头部元素,xxxLast操作队列尾部元素。

另外Deque可以表示一个栈(stack):具有后进先出(LIFO)的特征。

  • push(E e) 入栈
  • pop() 出栈,如果栈为空时出栈会抛出NoSuchElementException异常,所以在出栈之前先peek()查看头部元素,如果栈为空会返回null.

Stack类

Java中还有一个Stack类,这个类继承Vector。

public class Stack<E> extends Vector<E> {

从源码中可以看到Stack的pop()和peek()方法都是被synchronized修饰的。因此Stack的栈是线程安全的,但也因此降低了栈的性能。所以当我们不需要线程安全的场景时,应该用Deque.

public synchronized E peek()

public synchronized E pop()

最新文章

  1. 服务器支持AspJpeg和JMail45_free.msi组件
  2. Mac下JDK安装配置
  3. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
  4. oracle对象类型
  5. C#客户端链接网页需要用到的WebClient
  6. Entity SQL 初入
  7. regular expression 基本语法
  8. python特性、属性以及私有化
  9. Qt将窗体变为顶层窗体(activateWindow(); 和 raise() )
  10. Java Object 对象拷贝
  11. ubuntu 16.04 安装 vscode
  12. python的dir()和__dict__属性的区别
  13. Scrapy (网络爬虫框架)入门
  14. python_05 可变类型与不可变类型、集合、字符串格式化
  15. git 提交命令
  16. 使用__FILE__和__LINE__定位错误
  17. PS切图导出代码后出现的图片布局散乱的解决方法——table布局
  18. java ssm 后台框架平台 项目源码 websocket即时聊天发图片文字 好友群组 SSM源码
  19. 洛谷 P1306 斐波那契公约数
  20. jQuery动画中stop()与 finish()区别

热门文章

  1. NSString 与NSMutableString的区别
  2. Java编译时根据调用该方法的类或对象所属的类决定
  3. 原生js的容易忽略的相似点(二)
  4. 洛谷 P2788 数学1(math1)- 加减算式
  5. 导入Excel表格(二)
  6. zk伪集群部署
  7. JavaSE-31 Java正则表达式
  8. OERR: ORA-1410 "invalid ROWID" Master Note / Troubleshooting, Diagnostic and Solution (文档ID 1410.1)
  9. /etc/rc.d启动目录详解
  10. Python运维工程师