一、描述

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

下面是集合体系继承树:

二、Queue

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

Queue源码定义:

  1. public interface Queue<E> extends Collection<E> {
  2. boolean add(E e);
  3. boolean offer(E e);
  4. E remove();
  5. E poll();
  6. E element();
  7. E peek();
  8. }
  • 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源码定义:

  1. public interface Deque<E> extends Queue<E> {
  2. void addFirst(E e);
  3. void addLast(E e);
  4. boolean offerFirst(E e);
  5. boolean offerLast(E e);
  6. E removeFirst();
  7. E removeLast();
  8. E pollFirst();
  9. E pollLast();
  10. E getFirst();
  11. E getLast();
  12. E peekFirst();
  13. E peekLast();
  14. boolean removeFirstOccurrence(Object o);
  15. boolean removeLastOccurrence(Object o);
  16. // *** Queue methods ***
  17. boolean add(E e);
  18. boolean offer(E e);
  19. E remove();
  20. E poll();
  21. E element();
  22. E peek();
  23. // *** Stack methods ***
  24. void push(E e);
  25. E pop();
  26. // *** Collection methods ***
  27. boolean remove(Object o);
  28. boolean contains(Object o);
  29. public int size();
  30. Iterator<E> iterator();
  31. Iterator<E> descendingIterator();
  32. }

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

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

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

Stack类

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

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

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

  1. public synchronized E peek()
  2. public synchronized E pop()

【Java源码】集合类-队列Queue的更多相关文章

  1. laravel源码分析-队列Queue

    laravel 源码分析具体注释见 https://github.com/FX-Max/source-analysis-laravel 前言 队列 (Queue) 是 laravel 中比较常用的一个 ...

  2. 【笔记0-开篇】面试官系统精讲Java源码及大厂真题

    背景 开始阅读 Java 源码的契机,还是在第一年换工作的时候,被大厂的技术面虐的体无完肤,后来总结大厂的面试套路,发现很喜欢问 Java 底层实现,即 Java 源码,于是我花了半年时间,啃下了 J ...

  3. 【java集合框架源码剖析系列】java源码剖析之TreeSet

    本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...

  4. 【java集合框架源码剖析系列】java源码剖析之HashSet

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于HashSet的知识. 一HashSet的定义: public class HashSet&l ...

  5. Java源码系列1——ArrayList

    本文简单介绍了 ArrayList,并对扩容,添加,删除操作的源代码做分析.能力有限,欢迎指正. ArrayList是什么? ArrayList 就是数组列表,主要用来装载数据.底层实现是数组 Obj ...

  6. Java源码赏析(三)初识 String 类

    由于String类比较复杂,现在采用多篇幅来讲述 这一期主要从String使用的关键字,实现的接口,属性以及覆盖的方法入手.省略了大部分的字符串操作,比如split().trim().replace( ...

  7. 如何阅读Java源码 阅读java的真实体会

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心.   说到技术基础,我打个比 ...

  8. Android反编译(一)之反编译JAVA源码

    Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具  dex2jar   http://code.go ...

  9. 如何阅读Java源码

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...

  10. Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库

    http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...

随机推荐

  1. ASP.NET Core 企业级开发架构简介及框架汇总 (转载)

    ASP.NET Core 企业开发架构概述 企业开发框架包括垂直方向架构和水平方向架构.垂直方向架构是指一个应用程序的由下到上叠加多层的架构,同时这样的程序又叫整体式程序.水平方向架构是指将大应用分成 ...

  2. SPOJ COT2 Count on a tree II (树上莫队,倍增算法求LCA)

    题意:给一个树图,每个点的点权(比如颜色编号),m个询问,每个询问是一个区间[a,b],图中两点之间唯一路径上有多少个不同点权(即多少种颜色).n<40000,m<100000. 思路:无 ...

  3. codevs 1422 河城荷取

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 在幻想乡,河城荷取是擅长高科技工业的河童.荷取的得意之作除了光学迷彩外,还有 ...

  4. java异常处理中的细节

    首先看一段代码 public class Test{ public static String output=""; public static void foo(int i){ ...

  5. 数组排序 sort

    数组排序 this.dataShow = this.data.sort((a, b) => { return parseInt(a[this.innerOrderBy]) - parseInt( ...

  6. Zend studio 修改编码格式

    一.临时修改编码格式 edit -> Set Encoding... -> Other(选择) 二.修改软件默认编码格式

  7. Linux 常用命令:解压缩

    目录 Linux 常用命令:解压缩 说明 tar 涉及参数说明: 压缩 解压 zip压缩 涉及参数说明: uzip解压 涉及参数说明: gzip 涉及参数说明: 压缩率比较 Linux 常用命令:解压 ...

  8. run_debug和run_demo的区别

    run_demo:给一张图,直接生成测试出来的框,输入不用给gt框 run_debug:生成ap值,生成的图片既有gt框也有测试得到的结果框 run_demo的源码demo_test放在example ...

  9. JavaSE-01 认识Java

    01  认识Java 学习要点 程序的概念 Java技术内容 使用记事本开发简单的java程序 使用输出语句在控制台输出信息 熟悉Eclipse开发环境 程序的概念 源自生活 例如五一节计划:春光明媚 ...

  10. Fiddler设置显式IP地址

    打开Fiddler, 菜单栏:Rules->Customize Rules… 或快捷键 Ctrl+R . 通过快捷键 Ctrl+F ,搜索:static function Main() 函数. ...