• Java中的队列


    关于队列

    队列(Queue)是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。

    如下图,可以把队列比作成排队领票的一队人,先到的人先领票,后到的人后拿票。

    队列可以同时对头和尾进行操作,如果我定义一个数组,我可以取出头a[o],也可以在a[5]后面添加新的元素a[6]。

    关于 Queue 接口

    队列的方法摘要

    修饰语和类型 方法和说明
    boolean add(E e)
              将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException
    E element()
              获取,但是不移除此队列的头。
    boolean offer(E e)
              将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
    E peek()
              获取但不移除此队列的头;如果此队列为空,则返回 null
    E poll()
              获取并移除此队列的头,如果此队列为空,则返回 null
    E remove()
              获取并移除此队列的头。

     

     

     

     

     

    实例

    这里我暂且用数组来实现栈

    ps:我这里用了java的泛型,关于java的泛型在前面的随笔里我有介绍。

     1 import java.util.Arrays;
     2 
     3 public class Queue<E> {
     4 
     5     // 新建一个长度为0的数组
     6     private Object[] src = new Object[0];
     7 
     8     // 将数据加入队列
     9     public void add(E s) {
    10         // 复制src数组,长度为原数组的长度+1
    11         E[] e = (E[]) Arrays.copyOf(src, src.length + 1);
    12         // 将传入的数据给新数组的最后一个元素
    13         e[e.length - 1] = (E) s;
    14         src = e;
    15     }
    16 
    17     // 查看队列头的数据
    18     public E peek() {
    19         //判断队列是否为空
    20         if(src.length==0) {
    21             return null;
    22         }
    23         // 返回src数组的第一个元素
    24         return (E) src[0];
    25     }
    26 
    27     // 弹出队列头的数据[移除]
    28     public E poll() {
    29         if (src.length == 0) {
    30             return null;
    31         }
    32         //将src数组复制给新数组,方便弹出队列头的数据
    33         E[] s = (E[]) Arrays.copyOf(src, src.length);
    34         //新建一个长度为原数组长度-1的数组,将原数组去掉第一个元素后复制给新数组
    35         Object[] st =new Object[src.length - 1];
    36         for (int i = 0; i < st.length; i++) {
    37             st[i] = (E) src[i + 1];
    38         }
    39         src = st;
    40         return s[0];
    41     }
    42 
    43     // 获得队列的长度
    44     public int size() {
    45         return src.length;
    46     }
    47 
    48     // 判断队列是否为空
    49     public boolean empty() {
    50         return src.length == 0;
    51     }
    52     
    53     public static void main(String[] args) {
    54         Queue<String> q=new Queue<String>();
    55         
    56         //将数据加入队列
    57         q.add("AA");
    58         q.add("BB");
    59         q.add("CC");
    60         q.add("DD");
    61         
    62         System.out.println("队列头的数据为:"+q.peek());
    63         
    64         System.out.println("队列的长度为:"+q.size());
    65         
    66         while(!q.empty()) {
    67             System.out.println("弹出数据:"+q.poll());
    68         }
    69     }
    70 }

    运行结果:

    队列头的数据为:AA
    队列的长度为:4
    弹出数据:AA
    弹出数据:BB
    弹出数据:CC
    弹出数据:DD

    结果分析

    遵循了队列 ‘ 先进先出 ’ 的特性,输入 AA、BB、CC、DD,弹出 AA、BB、CC、DD。

    根据这个特性,队列在某些时候是必不可少的。

  • 相关阅读:
    log4net logfornet 配置和用法
    seaJs学习笔记
    docker 创建tomcat镜像
    配置alibaba的yum 源
    maven 中 jar管理
    docker 创建elasticsearch集群镜像
    springboot 常用插件
    elasticsearch插件安装之--linux下安装及head插件
    docker 创建jdk镜像
    docker 创建基础镜像
  • 原文地址:https://www.cnblogs.com/jwznb/p/9059278.html
Copyright © 2020-2023  润新知