【Java源码】集合类-队列Queue

一、描述

队列Queue这种数据结构,通常指先进先出(FIFO)这种容器。可以模拟生活中依次排队这种场景。

下面是集合体系继承树:

二、Queue

Queue和List一样都是Collection的子接口。

Queue源码定义:

public interface Queue<E> extends Collection<E> {
    boolean add(E e);
    boolean offer(E e);
    E remove();
    E poll();
    E element();
    E peek();
}
  • add(E e)/offer(E e) 将指定元素加入到队列尾部
  • remove() 返回队列头部元素并删除,如果队列为空,会抛NoSuchElementException
  • poll() 返回队列头部元素并删除,如果队列为空,返回null
  • element() 返回队列头部元素不删除,如果队列为空,会抛NoSuchElementException
  • peek() 返回队列头部元素不删除,如果队列为空,返回null

Queue的实现有PriorityQueue、ArrayDeque、LinkedList。其中ArrayDeque、LinkedList是实现的其子接口Deque。

三、Deque

从上面的继承图可以清楚的看到,Deque是Queue的子接口,它不仅是队列的数据结构,也是一个双端队列数据结构,同时也是一个栈(stack)的数据结构。

Deque源码定义:

public interface Deque<E> extends Queue<E> {
    void addFirst(E e);
    void addLast(E e);
    boolean offerFirst(E e);
    boolean offerLast(E e);
    E removeFirst();
    E removeLast();
    E pollFirst();
    E pollLast();
    E getFirst();
    E getLast();
    E peekFirst();
    E peekLast();
    boolean removeFirstOccurrence(Object o);
    boolean removeLastOccurrence(Object o);
    
    // *** Queue methods ***
    boolean add(E e);
    boolean offer(E e);
    E remove();
    E poll();
    E element();
    E peek();
    
    // *** Stack methods ***
    void push(E e);
    E pop();
    
    // *** Collection methods ***
    boolean remove(Object o);
    boolean contains(Object o);
    public int size();
    Iterator<E> iterator();
    Iterator<E> descendingIterator();

}

Deque的接口和上面的Queue的操作基本相同。xxxFirst操作队列头部元素,xxxLast操作队列尾部元素。

另外Deque可以表示一个栈(stack):具有后进先出(LIFO)的特征。

  • push(E e) 入栈
  • pop() 出栈,如果栈为空时出栈会抛出NoSuchElementException异常,所以在出栈之前先peek()查看头部元素,如果栈为空会返回null.

Stack类

Java中还有一个Stack类,这个类继承Vector。

public class Stack<E> extends Vector<E> {

从源码中可以看到Stack的pop()和peek()方法都是被synchronized修饰的。因此Stack的栈是线程安全的,但也因此降低了栈的性能。所以当我们不需要线程安全的场景时,应该用Deque.

public synchronized E peek()

public synchronized E pop()

posted @   monkjavaer  阅读(804)  评论(0编辑  收藏  举报
编辑推荐:
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
阅读排行:
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 提示词工程师自白:我如何用一个技巧解放自己的生产力
· 一文搞懂MCP协议与Function Call的区别
· 如何不购买域名在云服务器上搭建HTTPS服务
点击右上角即可分享
微信分享提示