一.queue接口

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

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

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

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

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

实现这个接口的类有:

下面说两个常用方法。

1.boolean offer(E e)

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

2.E poll()

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

我们来举个例子:

import java.util.ArrayDeque;
import java.util.Queue; public class Demo01 {
public static void main(String[] args) {
Queue<Request> que = new ArrayDeque<Request>();//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<Request> 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<Request> que = new ArrayDeque<Request>();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<Request> que){
Request req = null;
while((req = ((ArrayDeque<Request>) 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
--------
//从后向前移除就是将尾部元素返回,并且将尾部前移一位。

最新文章

  1. Andriod学习笔记4:mac下搭建 Eclipse+CDT 集成开发环境
  2. Angular表单验证
  3. iOS开发系列--C语言之指针
  4. 一个请求在Struts2框架中的处理流程
  5. js toString()
  6. MD5 32位 小写加密和大写加密
  7. AndroidStudio 中的坑Error:(1, 0) Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRID
  8. 07---Net基础加强
  9. 【转】终于干了点正事。。三天用了三个库opencv、emgu、aforge.net[2011.7.30]
  10. TreeMap实现原理
  11. Java的finally理解
  12. How to scroll the window using JQuery $.scrollTo() function
  13. HNOI2004 宠物收养所 解题报告
  14. [sublime]用sublime搭建属于自己的Python的IDE
  15. 7.6 chcount.c -- 使用逻辑与运算符
  16. helm安装 删除
  17. django —— MVT模型
  18. 转载 线程初步了解 - &lt;第一篇&gt;
  19. Java之相对路径找不到文件问题解决方法
  20. 深入一下Django的用户认证和cache

热门文章

  1. 证明spring中&lt;property name=&quot;&quot;&gt;这个双引号的内容只与setter方法有关,与一个类定义的字段和getter方法无关
  2. Spring - IoC(2): 属性注入 &amp; 构造注入
  3. 【poj3260-最少找零】多重背包+完全背包
  4. bzoj4756 [Usaco2017 Jan]Promotion Counting
  5. 【51NOD】1486 大大走格子
  6. bzoj 1045糖果传递 数学贪心
  7. SELinux 案例 1
  8. shell浅谈之三for、while、until循环【转】
  9. C#后台调用js方法无效果,未解决。
  10. [ Centos 7 iscsi搭建 及 1台客户端同时挂载多台iscsi服务端问题 ]