欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java集合框架中的队列--Queue

程序员文章站 2022-06-08 08:09:32
...

Java中的队列

========

最近在看《java核心技术》,在学习到集合框架的队列一处时,发现书中介绍不太详尽,直接从Deque接口(双端队列)及其实现类开始讲起。结合网络上的博文,在此写下自己的理解以加强记忆并记录下学习所得,如有不正欢迎指出。

1. 关系

在java5中新增加了java.util.Queue接口,定义了队列的一些基本操作,他扩展了Collection接口。java6中定义了Deque(双端队列)接口,扩展了Queue接口定义了双端队列的操作。除此以外还分别有BlockingQueue(阻塞队列)接口,AbstractQueue(非阻塞队列)抽象类。
Java集合框架中的队列--Queue

2. Queue接口

其方法定义如下

    boolean add(E element);//添加元素,队满时抛出异常
    boolean offer(E element);//添加元素,队满时返回false
    E remove();        //删除并返回队头元素,队空时抛出异常
    E poll();     //删除并返回队头元素,队空时返回null
    E element();//返回队头元素但不删除,队空时抛出异常
    E peek();//返回队头元素但不删除,队空时返回null

其实现类有LinkedList,PriorityQueue。

    LinkedList是一个普通队列,具有入队出队等操作。
    PriorityQueue是一个比较标准的队列实现类,之所以说其标准,是因为其保存队列元素不是按其入队顺序,而是按照队列大小对其重新排序,因此出队的元素通常是最小元素。我们称之为优先级队列,学过操作系统的小伙伴应该对优先级队列非常清楚了,这里不做详细介绍。

3. Deque

它扩展了Queue接口,定义了以下方法

    void addFirst(E element);//添加元素到队头,队满时抛出异常
    void addLast(E element);//添加元素到队尾,队满时抛出异常
    boolean offerFirst(E element);//添加元素到队头,队满时返回false
    boolean offerLast(E element);//添加元素到队尾,队满时返回false
    E removeFirst();//删除并返回队头元素,队空时抛出异常
    E removeLast();//删除并返回队尾元素,队空时抛出异常
    E pollFirst();//删除并返回队头元素,队空时返回null
    E pollLast();//删除并返回队尾元素,队空时返回null
    E getFirst();//返回队头元素但不删除,队空时抛出异常
    E getLast();//返回队尾元素但不删除,队空时抛出异常
    E peekFirst();//返回队头元素但不删除,队空时返回null
    E peekLast();//返回队尾元素但不删除,队空时返回null

其实现类有ArayDeque和LinkedList

    这两个实现类都实现了双端队列的功能,同时ArrayDeque也可以当作一个普通队列来使用,这里不做详细介绍。值得注意的是LinkedList实现类,他也实现了Queue,这样怎么区分呢?这就要由变量的声名来区分开了,如下:
    Queue<String> queue=new LinkedList<>();
    Deque<String> deque=new LinkedList<>();
    deque.getFirst();//queue调用此方法报错,方法不存在

看到这里我想读者应该明白两者的区别了,可以自行尝试。此外LinkedList也是List的实现类,区别方法类似。

4. BlockingQueue

    以上几个队列不是线程安全的。此接口定义了一个阻塞队列,以实现线程安全的队列,此接口在此不做详细介绍。

其实现类有

    DelayQueue
    SyncHronousQueue
    PriorityBlockingQueue
    LinkedBlockingQueue
    ArrayBlockQueue

6. AbstractQueue

AbstractQueue是一个非阻塞队列,继承于AbstractCollection,实现了Queue接口,是一个抽象类,它的add()、remove()、element()是基于offer()、poll()、peek()来实现的。

其方法如下

    boolean add(E e);
    E remove();
    E element();
    void clear();//clear方法一直调用poll
    boolean addAll(Collection<? extends E> c);

此文主要梳理了队列下的继承关系及接口方法、实现类,为个人学习所得,如有不正欢迎指出。

相关标签: java Queue