一.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
--------
//从后向前移除就是将尾部元素返回,并且将尾部前移一位。

5.6(java学习笔记) queue的更多相关文章

  1. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  2. 20145330第五周《Java学习笔记》

    20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...

  3. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  4. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  5. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  6. Java学习笔记(04)

    Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...

  7. 0032 Java学习笔记-类加载机制-初步

    JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...

  8. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  9. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  10. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

随机推荐

  1. SQL优化单表案例

    数据准备: -- 创建数据库 mysql> create database db_index_case; Query OK, row affected (0.00 sec) -- 查看数据库 m ...

  2. Nginx配置配置文件详解

    文章目录 配置文件 nginx.conf配置文件详解 用于调试.定位问题的配置参数 正常运行必备的配置参数 优化性能的配置参数 事件相关配置 Fastcgi相关配置参数 常需要调整的参数 nginx作 ...

  3. Eclipse工具栏太多,自定义工具栏,去掉调试

    Window --> Customize Perspective... --> Tool Bar Visibility 去掉勾选debug  Tip:最新版本Customize Persp ...

  4. codechef T1 What's int the name

    NITIKA: 姓名本无意题目描述 Nitika 读了一本历史书,想要理清其中的人物关系.因此她要她的哥哥把书中出现的历史人 物全部列出来.哥哥把列好的人名给了 Nitika,但 Nitika 非常不 ...

  5. [BZOJ1010][HNOI2008]玩具装箱toy 解题报告

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  6. 【BZOJ】ARC083 E - Bichrome Tree

    [算法]树型DP [题意]给定含n个点的树的形态,和n个数字Xv,要求给每个点赋予黑色或白色和权值,满足对于每个点v,子树v中和v同色的点的权值和等于Xv.n<=10^5 [题解]首先每个点的权 ...

  7. [bzoj3098]Hash Killer 2——哈希

    题目 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题: 给你一个长度为N的字符串S,求有多少个不同的长度为L的子串. 子串的定义是S[l].S[l + 1].- S[r]这样连续的一 ...

  8. kickstart构建Live CD 添加文件问题

    在构建自定义ISO的时候,有时候需要从母体机器拷贝文件到Live CD系统.比如拷贝/home/xiaoxiaoleo/hello 程序,在Kickstart配置文件里, post脚本添加--noch ...

  9. python3 迭代器,生成器

    一 .什么是迭代 1. 重复 2.下次重复一定是基于上一次的结果而来 while True: cmd=input(':') print(cmd) l=[1,2,3,4] count=0 while c ...

  10. Django基础之视图

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...