zoukankan      html  css  js  c++  java
  • 5.6(java学习笔记) queue

    一.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 --------
    //从后向前移除就是将尾部元素返回,并且将尾部前移一位。
  • 相关阅读:
    X5webview完美去掉分享功能和缓存功能(2)
    bintray 在android3.2上传遇到的问题
    x5webview 自定义全屏界面
    X5webview去掉分享功能和缓存功能
    buglly热更新集成遇到的那些坑
    腾讯x5webview集成实战
    动态权限<三>华为小米特殊机制
    android 判断应用是否在前台显示
    动态权限<二>之淘宝、京东、网易新闻 权限申请交互设计对比分析
    android 图片二维码识别和保存(二)
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/9800498.html
Copyright © 2011-2022 走看看