5.6(java学习笔记) queue

5.6(java学习笔记) queue

一.queue接口

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

 

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

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

 

5.6(java学习笔记) queue

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

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

 

实现这个接口的类有:

5.6(java学习笔记) queue

 

下面说两个常用方法。

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类型的数组。

5.6(java学习笔记) queue

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

 

offer(E e)

5.6(java学习笔记) queue

5.6(java学习笔记) queue

5.6(java学习笔记) queue

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

尾部索引后移一位。

 

我们接着来看下poll();

5.6(java学习笔记) queue

5.6(java学习笔记) queue

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101367.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 正则提取字符串中的数字_正则表达式忽略空格python

    正则提取字符串中的数字_正则表达式忽略空格pythonpython从字符串中提取数字使用正则表达式,用法如下:##总结##^匹配字符串的开始。##$匹配字符串的结尾。##\b匹配一个单词的边界。##\d匹配任意数字。##\D匹配任意非数字字符。##x?匹配一个可选的x字符(换言之,它匹配1次或者0次x字符)。##x*匹配0次或者多次x字符。##x+匹配1次或者多次x字符。…

  • Java代码生成器原理和编写

    Java代码生成器原理和编写代码生成器的原理其实是非常简单的,主要可以分为下面两个步骤: 数据库元数据抓取 模板输出 第一步数据库元数据信息抓取这里给大家提供些简单易于操作的思路,我们找到数据库连接中的information_schema这个库,这个库就是元数据库,保存着其他库以及库表的信息,并且一直维护.我们想要做到根据数据库去动态生成代码,那么就需要拿到生成代码的对应的数据库,表,以及字段等信息.下面给大家提供一下获取数据库,获取数据库表,获取数据库表字段的SQL语句获取连接中的所有数据..

  • pycharm安装、首次使用及汉化

    pycharm安装、首次使用及汉化一、下载pycharm安装包打开PyCharm的官方下载地址:http://www.jetbrains.com/pycharm/download/#section=windows打开网站后的界面展示如图:professional是专业版,可以免费试用,community是社区版,是免费开源的,推荐下载使用社区版。下载后的PyCharm:二、安装1.双击应用程序后点击【Next】…

  • 补码的加减法运算_简述补码减法运算的规则

    补码的加减法运算_简述补码减法运算的规则补码的加减法运算本文内容参考自王达老师的《深入理解计算机网络》一书&lt;中国水利水电出版社&gt;一、补码加法:1、补码的加法运算两个机器数相加的补码可以先通过分别对两个机器数求补码,然后再相加得到,在采用补码形式表示时,进行加法运算可以把符号位和数值位一起进行运算(若符号位有进位,导致了益出,则直接舍弃),结果为两数之和的补码形式。示例1:求两个十进制数的和35+18。首先,规…

  • 记laravel项目,本地环境PHP7.1,线上PHP版本7.2,报错each函数废弃问题

    记laravel项目,本地环境PHP7.1,线上PHP版本7.2,报错each函数废弃问题

  • python精彩编程200例-python趣味编程100例(99个)

    【实例简介】python如今很流行,AI的首选工具;python趣味编程100例(99个),学习编程不枯燥。【实例截图】【核心代码】python趣味编程100例(99个)└──python趣味编程100例(99个)├──JCP001.py├──JCP002.py├──JCP003.py├──JCP004.py├──JCP005.py├──JCP006.py├──JCP007.py├…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号