资讯专栏INFORMATION COLUMN

Java™ 教程(Queue接口)

RayKr / 2603人阅读

Queue接口

Queue是在处理之前保存元素的集合,除了基本的Collection操作外,队列还提供额外的插入、删除和检查操作,Queue接口如下。

public interface Queue extends Collection {
    E element();
    boolean offer(E e);
    E peek();
    E poll();
    E remove();
}

每个Queue方法都有两种形式:(1)如果操作失败则抛出异常,(2)如果操作失败,则返回特殊值(nullfalse,具体取决于操作),接口的常规结构如下表所示。

操作类型 抛出异常 返回特殊值
插入 add(e) offer(e)
移除 remove() poll()
检查 element() peek()

队列通常(但不一定)以FIFO(先进先出)方式对元素进行排序,优先级队列除外,它们根据元素的值对元素进行排序 — 有关详细信息,请参阅“对象排序”部分。无论使用什么排序,队列的头部都是通过调用removepoll移除的元素。在FIFO队列中,所有新元素都插入队列的尾部,其他类型的队列可能使用不同的放置规则,每个Queue实现都必须指定其排序属性。

Queue实现可以限制它所拥有的元素数量,这样的队列被称为有界,java.util.concurrent中的某些Queue实现是有界的,但java.util中的实现不是。

QueueCollection继承的add方法插入一个元素,除非它违反了队列的容量限制,在这种情况下它会抛出IllegalStateExceptionoffer方法,仅用于有界队列,与add不同之处仅在于它通过返回false来表示插入元素失败。

removepoll方法都移除并返回队列的头部,确切地移除哪个元素是队列的排序策略的函数,仅当队列为空时,removepoll方法的行为才有所不同,在这些情况下,remove抛出NoSuchElementException,而poll返回null

elementpeek方法返回但不移除队列的头部,它们之间的差异与removepoll的方式完全相同:如果队列为空,则element抛出NoSuchElementException,而peek返回null

队列实现通常不允许插入null元素,为实现Queue而进行了改进的LinkedList实现是一个例外,由于历史原因,它允许null元素,但是你应该避免利用它,因为nullpollpeek方法用作特殊的返回值。

队列实现通常不定义equalshashCode方法的基于元素的版本,而是从Object继承基于标识的版本。

Queue接口不定义阻塞队列方法,这在并发编程中很常见,这些等待元素出现或空间可用的方法在java.util.concurrent.BlockingQueue接口中定义,该接口扩展了Queue

在以下示例程序中,队列用于实现倒数计时器,队列预先加载了从命令行上指定的数字到0的所有整数值,按降序排列,然后,从队列中删除值并以一秒的间隔打印。该程序是人为的,因为在不使用队列的情况下执行相同的操作会更自然,但它说明了在后续处理之前使用队列来存储元素。

import java.util.*;

public class Countdown {
    public static void main(String[] args) throws InterruptedException {
        int time = Integer.parseInt(args[0]);
        Queue queue = new LinkedList();

        for (int i = time; i >= 0; i--)
            queue.add(i);

        while (!queue.isEmpty()) {
            System.out.println(queue.remove());
            Thread.sleep(1000);
        }
    }
}

在以下示例中,优先级队列用于对元素集合进行排序,同样,这个程序是人为的,因为没有理由使用它来支持集合中提供的排序方法,但它说明了优先级队列的行为。

static  List heapSort(Collection c) {
    Queue queue = new PriorityQueue(c);
    List result = new ArrayList();

    while (!queue.isEmpty())
        result.add(queue.remove());

    return result;
}
上一篇:List接口 下一篇:Deque接口

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73378.html

相关文章

  • Java教程(集合接口

    集合接口 核心集合接口封装了不同类型的集合,如下图所示,这些接口允许独立于其表示的细节来操纵集合,核心集合接口是Java集合框架的基础,如下图所示,核心集合接口形成层次结构。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一种特殊的Collection,SortedSet是一种特殊的Set,依此类推,另请注意,层次结构...

    elisa.yang 评论0 收藏0
  • Java教程(Deque接口

    Deque接口 通常读作deck,deque是双端队列,双端队列是元素的线性集合,支持在两个端点处插入和移除元素,Deque接口是比Stack和Queue更丰富的抽象数据类型,因为它同时实现堆栈和队列。Deque接口定义了访问Deque实例两端元素的方法,提供了插入、移除和检查元素的方法,ArrayDeque和LinkedList等预定义类实现了Deque接口。 请注意,Deque接口既可以用作后...

    lastSeries 评论0 收藏0
  • Java教程(目录)

    Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...

    lifesimple 评论0 收藏0
  • 重拾Java Network Programming(二)InetAddress

    摘要:前言今天,我将梳理在网络编程中很重要的一个类以及其相关的类。这类主机通常不需要外部互联网服务,仅有主机间相互通讯的需求。可以通过该接口获取所有本地地址,并根据这些地址创建。在这里我们使用阻塞队列实现主线程和打印线程之间的通信。 前言 今天,我将梳理在Java网络编程中很重要的一个类InetAddress以及其相关的类NetworkInterface。在这篇文章中将会涉及: InetA...

    daryl 评论0 收藏0
  • Java中的Queue与Deque

    摘要:最小初始化容量。它作为堆栈队列双端队列的操作和的操作是一致的,只是内部的实现不同。根据元素内容查找和删除的效率比较低,为。但是接口有对应的并发实现类类。 Queue接口的实现类 Queue接口作为队列数据结构,java在实现的时候,直接定义了Deque接口(双端队列)来继承Queue接口,并且只实现Deque接口。这样java中的双端队列就囊括了队列、双端队列、堆栈(Deque接口又定...

    zhangrxiang 评论0 收藏0

发表评论

0条评论

RayKr

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<