java队列转集合_Java集合 使用Queue
队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只有两个操作:
把元素添加到队列末尾;
从队列头部取出元素。
超市的收银台就是一个队列:
在Java的标准库中,队列接口Queue定义了以下几个方法:
int size():获取队列长度;
boolean add(E)/boolean offer(E):添加元素到队尾;
E remove()/E poll():获取队首元素并从队列中删除;
E element()/E peek():获取队首元素但并不从队列中删除。
对于具体的实现类,有的Queue有最大队列长度限制,有的Queue没有。注意到添加、删除和获取队列元素总是有两个方法,这是因为在添加或获取元素失败时,这两个方法的行为是不同的。我们用一个表格总结如下:
throw Exception返回false或null
添加元素到队尾
add(E e)
boolean offer(E e)
取队首元素并删除
E remove()
E poll()
取队首元素但不删除
E element()
E peek()
举个栗子,假设我们有一个队列,对它做一个添加操作,如果调用add()方法,当添加失败时(可能超过了队列的容量),它会抛出异常:
Queue q =...try{
q.add("Apple");
System.out.println("添加成功");
}catch(IllegalStateException e) {
System.out.println("添加失败");
}
如果我们调用offer()方法来添加元素,当添加失败时,它不会抛异常,而是返回false:
Queue q =...if (q.offer("Apple")) {
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
当我们需要从Queue中取出队首元素时,如果当前Queue是一个空队列,调用remove()方法,它会抛出异常:
Queue q =...try{
String s=q.remove();
System.out.println("获取成功");
}catch(IllegalStateException e) {
System.out.println("获取失败");
}
如果我们调用poll()方法来取出队首元素,当获取失败时,它不会抛异常,而是返回null:
Queue q =...
String s=q.poll();if (s != null) {
System.out.println("获取成功");
}else{
System.out.println("获取失败");
}
因此,两套方法可以根据需要来选择使用。
注意:不要把null添加到队列中,否则poll()方法返回null时,很难确定是取到了null元素还是队列为空。
接下来我们以poll()和peek()为例来说说“获取并删除”与“获取但不删除”的区别。对于Queue来说,每次调用poll(),都会获取队首元素,并且获取到的元素已经从队列中被删除了:
import java.util.LinkedList;
import java.util.Queue;public classMain {public static voidmain(String[] args) {
Queue q = new LinkedList<>();//添加3个元素到队列:
q.offer("apple");
q.offer("pear");
q.offer("banana");//从队列取出元素:
System.out.println(q.poll()); //apple
System.out.println(q.poll()); //pear
System.out.println(q.poll()); //banana
System.out.println(q.poll()); //null,因为队列是空的
}
}
如果用peek(),因为获取队首元素时,并不会从队列中删除这个元素,所以可以反复获取:
import java.util.LinkedList;
import java.util.Queue;public classMain {public static voidmain(String[] args) {
Queue q = new LinkedList<>();//添加3个元素到队列:
q.offer("apple");
q.offer("pear");
q.offer("banana");//队首永远都是apple,因为peek()不会删除它:
System.out.println(q.peek()); //apple
System.out.println(q.peek()); //apple
System.out.println(q.peek()); //apple
}
}
从上面的代码中,我们还可以发现,LinkedList即实现了List接口,又实现了Queue接口,但是,在使用的时候,如果我们把它当作List,就获取List的引用,如果我们把它当作Queue,就获取Queue的引用:
//这是一个List:
List list = new LinkedList<>();//这是一个Queue:
Queue queue = new LinkedList<>();
始终按照面向抽象编程的原则编写代码,可以大大提高代码的质量。
小结
队列Queue实现了一个先进先出(FIFO)的数据结构:
通过add()/offer()方法将元素添加到队尾;
通过remove()/poll()从队首获取元素并删除;
通过element()/peek()从队首获取元素但不删除。
要避免把null添加到队列。
java队列转集合_Java集合 使用Queue相关推荐
- java list详解_java集合List解析
作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...
- java集合替换集合_Java集合–您必须知道的13件事
java集合替换集合 Java Collections Framework is one of the core parts of the Java programming language. Col ...
- java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet
前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...
- java list取值_Java集合详解
一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需要,我们要 ...
- java 队列和堆栈_Java中的堆栈和队列
java 队列和堆栈 我最近一直在研究一些需要堆栈和队列的Java代码. 使用的选择不是立即显而易见的. 有一个Queue接口,但没有明确的具体实现要使用. 还有一个Stack类,但是javadocs ...
- 集合_java集合框架
java集合框架图 简化图: Java平台提供了一个全新的集合框架."集合框架"主要由一组用来操作对象的接口组成. 不同接口描述一组不同数据类型. 1.Java 2集合框 ...
- java中的集合_Java 集合介绍,常用集合类
JAVA 集合 在处理数据的过程中经常会需要一个容器来存储某一类型的数据,Java 中的数组就是这样一种容器.但 Java 中的数组有其局限性,定义后的数组长度不可变,超出数组长度后就不能再存放数据了 ...
- java linkedlist源码_Java集合之LinkedList源码分析
一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...
- java的set接口_Java集合-Set接口
importorg.junit.Test;import java.util.*;/*** * Collection接口:单列集合,用来存储一个一个的对象 * (不常用)子接口Set:存储无序的.不可重 ...
最新文章
- openfoam linux教程,科学网—Windows10 安装OpenFOAM 教程 - 陈浩的博文
- JavaScript this指向相关内容
- Exchange 2007 被 SMTP中继***一例
- React开发(199):参数请求错误修改请求
- java-多线程知识
- 关于Merge的整理--AndroidScreenSlidePager开源库中用到的
- LBP特征算子原理过程
- comsol和java_COMSOL java API——编译comsol模型java文件
- Jmeter脚本录制
- Ubuntu中触摸板如何开启,关闭
- 主板检测卡c5_计算机主板检测卡检测显示C5是哪的問題?
- 【C语言】如何判断一个数字是否为素数(质数)?
- 浊音、清音、爆破音的信号特性分析
- 日积月累,聚沙成塔……
- 张靓颖同学2006年日程表
- 空气净化器上亚马逊需要提交UL867测试报告
- android 工具 Draw 9-patch 详解
- IP核Map编译报错:Buffers of the same direction cannot beplaced in series.
- 民族企业夯实科技能力 助力数字经济高质量发展
- 如何使用ArcGIS从天地图中提取水系
热门文章
- 食品、快速消费品行业的ERP兄弟们来此跟帖交流,开发实施路上的点点滴滴
- 【C/C++】“std::basic_ios _Elem,_Traits:无法访问private变量在类中的声明”错误原因与解决办法
- matlab强制数据类型转换
- 解决TIME_WAIT过多造成的问题
- boost智能指针之shared_ptr,scoped_ptr,intrusive_ptr,weak_ptr源码简析
- Flask-sqlalchemy连接数据库
- Toolbar+DrawerLayout
- linux怎么远程windows桌面,Windows系统怎么远程登陆桌面Linux?
- Yocto的使用实例
- Python字符串基础操作