博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5.6(java学习笔记) queue
阅读量:6884 次
发布时间:2019-06-27

本文共 3249 字,大约阅读时间需要 10 分钟。

一.queue接口

queue的中文意思是队列,是一种以先进先出方式处理数据的集合。

 

队列还提供额外的插入、提取和检查操作。这些方法都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(根据操作,为空或为假)。

后一种形式的插入操作是专门针对容量受限的队列实现设计的

 

有些方法以两种形式存在,只是操作失败时处理的方式不同,一个是抛出异常,一个是返回特殊值(false或null)。

这个根据自己需要进行选择。

 

实现这个接口的类有:

 

下面说两个常用方法。

1.boolean offer( e)

向队列中插入元素,如果操作成功返回true,反之返回false。

 

2. poll()

检索并移除队列的头部,返回移除的队列头部元素,如果头部为空则返回null。

 

我们来举个例子:

import java.util.ArrayDeque;import java.util.Queue;public class Demo01 {    public static void main(String[] args) {        Queue
que = new ArrayDeque
();//ArrayDeque是支持容量扩展的。 for(int i = 0; i < 10; i++){ final int num = i; que.offer(new Request(){//在队列中放入10个元素,此处使用匿名内部类 @Override public void deposit() { // TODO Auto-generated method stub System.out.println("第"+num+"个人存款:" + Math.random()*10000);//生产随机出模拟存款 } }); } dealWith(que);//输出队列。 System.out.println("--------"); dealWith(que); } public static void dealWith(Queue
que){//输出队列的方法 Request req = null; while((req = que.poll()) != null){ req.deposit(); } }}interface Request{//定义的一个接口 void deposit();}
运行结果:第0个人存款:8619.233801715016第1个人存款:5111.3672776256135第2个人存款:3833.7846958074883第3个人存款:534.977625279095第4个人存款:40.69671570731348第5个人存款:986.8179704462143第6个人存款:5995.7651112520325第7个人存款:8142.90423161368第8个人存款:5153.935940310687第9个人存款:4599.385486329686--------

可以看到,poll是移除队列头部并返回,所以输出完后无法再次输出队列。

 

其实添加元素就是不停在队列尾部添加,移除时不停将头部置为null并将头部后移。

我们来看下源码:

用于存放数据的是一个object类型的数组。

初始长度为16,容量不足可自动扩容。

 

offer(E e)

offer()最后调用的是addLast,tail是尾部的索引,我们可以看到将元素添加到尾部后,

尾部索引后移一位。

 

我们接着来看下poll();

移除元素就将头部元素给result,然后判断下如果头部为空则返回null.

后面将头部置null,然后返回头部元素,头部索引后移一位。

 

我们可以发现在队列中有向头部添加元素的方法,也有像尾部添加元素的方法。

这些结合下,我们能否用队列实现堆栈的功能?

 

堆栈是先进后出,我们也看了上列代码中添加时是在尾部添加,最后获取时是在头部获取才造成了先进先出的现象。

假如我们不断在尾部添加,添加完后再不断从尾部获取这样是不是就是实现了后进先出。

还是上列代码,我们只需要修改一个地方就可以了,将从头部开始移除并返回移除元素,改成从尾部开始移除,并返回尾部元素即可。

 

import java.util.ArrayDeque;import java.util.Queue;public class Demo01 {    public static void main(String[] args) {        Queue
que = new ArrayDeque
();for(int i = 0; i < 10; i++){ final int num = i; que.offer(new Request(){ @Override public void deposit() { // TODO Auto-generated method stub System.out.println("第"+num+"个人存款:" + Math.random()*10000); } }); } dealWith(que); System.out.println("--------" + o.length); dealWith(que); } public static void dealWith(Queue
que){ Request req = null; while((req = ((ArrayDeque
) que).pollLast()) != null){//将poll中原先调用pollFirst改为pollLast. req.deposit(); } }}interface Request{ void deposit();}
运行结果: 第9个人存款:4418.752779875663第8个人存款:894.3762449014581第7个人存款:6559.006752015596第6个人存款:2725.551000497387第5个人存款:1180.896859117061第4个人存款:7267.814454629828第3个人存款:9021.26681251365第2个人存款:5066.769610999404第1个人存款:6173.24968987338第0个人存款:6288.854161224456-------- //从后向前移除就是将尾部元素返回,并且将尾部前移一位。

转载于:https://www.cnblogs.com/huang-changfan/p/9800498.html

你可能感兴趣的文章
Matlab----获取一个文件夹下所有文件名
查看>>
jmeter报错
查看>>
bzoj4035【HAOI2015】数组游戏
查看>>
wchar_t与char转换、wstring与string转换
查看>>
git 命令
查看>>
Linux 查询服务数据
查看>>
【Luogu 2014】选课
查看>>
CSS 的介绍
查看>>
Latex自定义文档纸张大小
查看>>
2018QBXT刷题游记(23)
查看>>
函数递归
查看>>
android框架Java API接口总注释/**@hide*/和internal API
查看>>
20175318 2018-2019-2 《Java程序设计》第七周学习总结
查看>>
比特币:一种点对点的电子现金系统
查看>>
Android - 按钮组件详解
查看>>
MEF简单学习笔记
查看>>
Srping - bean的依赖注入(Dependency injection)
查看>>
NSAutoreleasePool 用处
查看>>
import matplotlib.pyplot as plt出错
查看>>
常用集合与Dictionary用例
查看>>