Java集合之Queue

> 转载请注明出处

队列是一种先进先出的数据结构。元素被追加到队列末尾,然后从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,拥有最高优先级的元素首先被删除。
Queue接口用附加的插入、提取和检验操作来扩展java.util.Collection。方法offer()用于向队列添加一个元素,类似Collection中的add方法,但是offer更适用于队列。方法poll()和remove()劣势,但如果队列为空,方法poll()会返回null,remove会抛出一个异常。方法peek()和element()类似,但是如果队列为空,peek()返回null,element()会抛出一个异常。

双端队列Deque(Double-ended queue) 支持在两端插入和删除元素。Deque接口用附加的从队列两端插入和删除元素的办法扩展Queue接口。方法addFirst()、removeFirst()、addLast()、removeLast()、getFirst()、和getLast()都定义在Deque接口中。LinkedList类实现了Deque接口,Deque又扩展了Queue接口。因此,可以使用LinkedList创建一个队列。

下面给出一个使用队列存储字符串的例子

/**
 * @author lxd
 * 2015-06-14
 */
public class TestQueue {

    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<String>();

        //添加元素
        queue.offer("BeiJing");
        queue.offer("ShangHai");
        queue.offer("GuangZhou");
        queue.offer("ShenZhen");
        queue.offer("DaLian");

        while (queue.size() > 0) {
            //获取并删除队列头,如果队列为空则抛出一个异常
            System.out.print(queue.remove() + " ");
        }
    }

}

结果:

BeiJing ShangHai GuangZhou ShenZhen DaLian 

PriorityQueue类实现一个优先队列,默认情况下,优先队列使用Comparable以元素的自然顺序进行排序。拥有最小数值的元素被赋予最高优先级。因此,最先从队列中删除。如果几个元素具有相同的最高优先级,其中的任意一个都可以从队列中删除。也可以使用构造方法PriorityQueue(initialCapacity, comparator)中的comparator来指定一个顺序。
下面是一个使用优先队列存储字符串的例子。

import java.util.Collections;
import java.util.PriorityQueue;

/**
 * @author lxd
 * 2015-06-14
 */
public class TestPriorityQueue {

    public static void main(String[] args) {

        //以字符串的自然顺序排序,升序从队列中删除
        PriorityQueue<String> queue = new PriorityQueue<String>();

        //添加元素
        queue.offer("BeiJing");
        queue.offer("ShangHai");
        queue.offer("GuangZhou");
        queue.offer("ShenZhen");
        queue.offer("DaLian");

        System.out.println("queue using Comparable:");
        while (queue.size() > 0) {
            System.out.print(queue.remove() + " ");
        }

        //以逆序方式对元素排序,字符串以降序从队列中删除
        PriorityQueue<String> queue2 = new PriorityQueue<String>(4, Collections.reverseOrder());

        //添加元素
        queue2.offer("BeiJing");
        queue2.offer("ShangHai");
        queue2.offer("GuangZhou");
        queue2.offer("ShenZhen");
        queue2.offer("DaLian");

        System.out.println("\nqueue using Comparator:");
        while (queue2.size() > 0) {
            System.out.print(queue2.remove() + " ");
        }
    }

}

结果:

queue using Comparable:
BeiJing DaLian GuangZhou ShangHai ShenZhen 
queue using Comparator:
ShenZhen ShangHai GuangZhou DaLian BeiJing 

Queue 接口并未定义阻塞队列的方法,而这在并发编程中是很常见的。BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口。
Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。
Queue 实现通常未定义 equals 和 hashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本,因为对于具有相同元素但有不同排序属性的队列而言,基于元素的相等性并非总是定义良好的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值