Java队列学习
队列是Java集合中的重要组成部分,具有先进先出的特性,使其具有广泛的应用场景,比如排队等。因此今天就来学习一下Java中的队列。本文的例子使用的Java8环境。
继承类图
学习队列,首先要知道它的类继承体系,知道每种队列都实现了哪些接口,继承了哪些类,这样有助于帮助我们理解。下面是Java8中队列的类继承图。
从继承类图中可以看出,队列主要分两种,一种是非阻塞队列,实现了Queue接口,包括LinkedList,ArrayDeque和PriorityQueue;一种是阻塞队列,实现了BlockingQueue,包括ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue和LinkedBlockingDeque.
Iterable接口
实现了Iterable接口的类就具有了迭代的功能,可以被用于“for-Each”循环语句。该接口具有的方法如下:
public interface Iterable<T> {
Iterator<T> iterator(); default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
} default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
Queue接口
Queue接口代表着队列,在队头删除元素,队尾插入元素,有着先进先出的特性,下面是接口声明的方法。
public interface Queue<E> extends Collection<E> { //插入元素到队尾,成功返回true,失败返回false,空间不足抛出异常
boolean add(E e); //插入元素到队尾,成功返回true,失败返回false
boolean offer(E e); //移除并返回队头元素,如果队列为空,抛出异常
E remove(); //移除并返回队头元素,如果队列为空,则返回null
E poll(); //返回队头元素,如果队列为空,则抛出异常
E element(); //返回队头元素,如果队列为空,则返回null
E peek();
}
Deque接口
Deque是双端队列,是Double End Queue的简称,与Queue只能在队头删除元素,队尾插入元素不同,Deque可以在队列的头尾分别进行插入和删除元素。由于可以在同一端进行插入和
删除元素,因此可以被当做栈来使用。下面是该接口声明的方法:
public interface Deque<E> extends Queue<E> {
/**
* 在队头插入元素,如果队列对容量有限制,则容量不足时抛出异常
* IllegalStatException
*/
void addFirst(E e); /**
* 在队尾插入元素,如果队列对容量有限制,则容量不足时抛出异常
* IllegalStatException
*/
void addLast(E e); /**
* 在队头插入元素,插入成功返回true,失败返回false
* 如果队列对容量有限制,则最好使用该方法
*/
boolean offerFirst(E e); /**
* 在队尾插入元素,成功返回true,失败返回false;
* 如果队列对容量有限制,则最好使用该方法
*/
boolean offerLast(E e); /**
* 返回并移除队头的元素,如果队列为空,则抛出异常
*/
E removeFirst(); /**
* 返回并移除队尾的元素,如果队列为空,则抛出异常
*/
E removeLast(); /**
* 返回并移除队头的元素,如果队列为空,则返回null
*/
E pollFirst(); /**
* 返回并移除队尾的元素,如果队列为空,则返回null
*/
E pollLast(); /**
* 返回队头的元素,如果队列为空,则抛出异常NoSuchElementException
*/
E getFirst(); /**
* 返回队尾的元素,如果队列为空,则抛出异常NoSuchElementException
*/
E getLast(); /**
* 返回队头的元素,如果队列为空,则返回null
*/
E peekFirst(); /**
* 返回队尾的元素,如果队列为空,则返回null
*/
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(); }
BlockingQueue接口
BlockingQueue是java.util.concurrent包提供的接口,表示阻塞队列,与普通队列的区别是:当从队头获取元素时,如果队列为空,则阻塞队列会阻塞,直到有可用元素、等待超时或者被中断;
当需要在队尾插入元素时,如果队列没有可用的空间,则操作会阻塞,直到有可用空间、等待超时或者被中断。下面是该接口声明的方法:
public interface BlockingQueue<E> extends Queue<E> { boolean add(E e); boolean offer(E e); /**
* 插入元素,如果空间不足,将会阻塞,直到有可用空间
*/
void put(E e) throws InterruptedException; /**
* 插入元素,如果容量不足,将会阻塞,直到有可用空间,或者等待超时
*/
boolean offer(E e, long timeout, TimeUnit unit)
throws InterruptedException; /**
* 返回并移除队头的元素,如果队列为空,则等待
*
*/
E take() throws InterruptedException; /**
* 返回并移除队头的元素,如果队列为空,则阻塞,直到有可用元素,或者等待超时
*
*/
E poll(long timeout, TimeUnit unit)
throws InterruptedException; /**
* 返回队列还能存放多少个元素
* 该方法不会被阻塞,直接返回
*/
int remainingCapacity(); /**
* 删除给定的元素,如果给定的元素在队列存在多个,则只删除第一个
* 成功删除,返回true,否则,返回false
*/
boolean remove(Object o); /**
* 队列中是否存在给定的元素,存在返回true,否则返回false
*/
public boolean contains(Object o); /**
* 从队列中删除所有元素,并添加到给定的容器c中
* 该方法比循环调用poll方法更高效
*/
int drainTo(Collection<? super E> c); /**
* 最多从队列中删除maxElements个元素,并添加到容器c中
*/
int drainTo(Collection<? super E> c, int maxElements);
}
BlockingDeque接口
BlockingDeque是双端阻塞队列,可以在队列的头和尾分别进行元素的插入和删除,可以用作阻塞栈,下面是该接口声明的方法:
public interface BlockingDeque<E> extends BlockingQueue<E>, Deque<E> {
void addFirst(E e); void addLast(E e); boolean offerFirst(E e); boolean offerLast(E e); void putFirst(E e) throws InterruptedException; void putLast(E e) throws InterruptedException; boolean offerFirst(E e, long timeout, TimeUnit unit) throws InterruptedException; boolean offerLast(E e, long timeout, TimeUnit unit) throws InterruptedException; E takeFirst() throws InterruptedException; E takeLast() throws InterruptedException; E pollFirst(long timeout, TimeUnit unit) throws InterruptedException; E pollLast(long timeout, TimeUnit unit) throws InterruptedException; boolean removeFirstOccurrence(Object o); boolean removeLastOccurrence(Object o); // *** BlockingQueue methods ***
boolean add(E e); boolean offer(E e); void put(E e) throws InterruptedException; boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException; E remove(); E poll(); E take() throws InterruptedException; E poll(long timeout, TimeUnit unit) throws InterruptedException; E element(); E peek(); boolean remove(Object o); public boolean contains(Object o); public int size(); Iterator<E> iterator(); // *** Stack methods ***
void push(E e);
}
Java队列学习的更多相关文章
- Java队列学习第一篇之列介绍
Java并发之显式锁和隐式锁的区别 在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchr ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Java编程学习知识点分享 入门必看
Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...
- Wmyskxz文章目录导航附Java精品学习资料
前言:这段时间一直在准备校招的东西,所以一晃眼都好长时间没更新了,这段时间准备的稍微好那么一点点,还是觉得准备归准备,该有的学习节奏还是要有..趁着复习的空隙来整理整理自己写过的文章吧..好多加了微信 ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- 这月薪过万的Java高级学习资料,难得一遇的干货,不下载真可惜了!
大家有没有想我呢 不管你们想不想我 我挺想你们的 通过昨天我不断的 死气白咧各种说好话 最终 要到了Java学科的Java集合学习资料 里面包含视频+资料+源码 堂兄也有一个愿望 希望你们月薪过万后 ...
- JAVA体系学习-导向
一:当前学习内容 数值类型处理总结,字符类型处理总结,日期类型处理总结 spring 事务源码分析 spring源码系列 二:当前学习 主攻:并发编程->RPC原理->MQ原理->- ...
- java后端学习记录2019
学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...
- 2019/3/2周末 java集合学习(一)
Java集合学习(一) ArraysList ArraysList集合就像C++中的vector容器,它可以不考虑其容器的长度,就像一个大染缸一 样,无穷无尽的丢进去也没问题.Java的数据结构和C有 ...
随机推荐
- 【Python篇】---Python3.5在Centoos的安装教程--超实用
一.前述 Python3在公司用的还是比较多的,但一般Centoos默认是python2的环境.所以本文就python3的安装做个总结. 二.具体 1.查看python版本python 命令即可 2. ...
- 虎牙直播张波:掘金Nginx日志
大家好!我是来自虎牙直播技术保障部的张波.今天主要会从数据挖掘层面跟大家探讨一下 Nginx 的价值.OpenResty 在虎牙的应用场景主要 WAF 和流控等方面,我今天主要分享的是“ Nginx ...
- springcloud~配置中心的使用
配置中心作为springcloud里最底层的框架,所发挥的意思是举足轻重的,所以的组件的配置信息都可以通过springcloud config来管理,它会把配置信息分布式的存储到git上,所以信息安全 ...
- 一个用来爬小说的简单的Node.js爬虫
小说就准备点天下霸唱和南派三叔的系列,本人喜欢看,而且数据也好爬.貌似因为树大招风的原因,这两作者的的书被盗版的很多,乱改的也多.然后作者就直接在网上开放免费阅读了,还提供了官网,猜想作者应该是允许爬 ...
- 西安活动 | 4月20日「拥抱开源,又见.NET :云时代 • 新契机」
云计算日渐兴起,成为提升企业效率和生产力的最终解决方案,而云时代也为软件开发模式带来了翻天覆地的变化.可以说 .NET Core就是这个时代催生的产物.自2016年 .NET Core 1.0 发布以 ...
- Asp.Net进程外Session(状态服务器Session、数据库Session)
介绍 我们知道,当浏览器关闭,或者网站重启的时候,会话就结束了.即Seesion就丢失了.(当Web.config配置文件改动,哪怕什么内容都不加,仅仅往配置文件中加一个空格都是改we.config变 ...
- SqlServer注意事项总结,高级程序员必背!
本篇文章主要介绍SqlServer使用时的注意事项. 想成为一个高级程序员,数据库的使用是必须要会的.而数据库的使用纯熟程度,也侧面反映了一个开发的水平. 下面介绍SqlServer在使用和设计的过程 ...
- 【转载】Mysql创建表时报错error150
从mysql数据库中导出正常数据库的脚本语句,而后使用脚本语句创建数据库的过程中,执行语句提示Can't Create Table 'XXX' erro150的错误,语句执行中断,创建table失败, ...
- 把list集合的内容写入到Xml中,通过XmlDocument方式写入Xml文件中
List<Person> list = new List<Person> { new Person{Name="张三",Age=20,Email=" ...
- linux的一些命令,面试经常碰到的
1 查询所有java进程ps -A | grep java解释一下这个命令的意思,ps 是查看系统当前进程的命令,参数 -A(注意,是大写,linux中是区分大小写的)是显示所有程序,| 这个是管道符 ...