java常用队列与堆栈

支持多线程操作的队列与堆栈【来源于GPT】:

  1. 队列(Queue):

    • ConcurrentLinkedQueue:基于链表实现的无界非阻塞队列,支持高并发操作。
    • ArrayBlockingQueue:基于数组实现的有界阻塞队列,支持多线程操作。
    • LinkedBlockingQueue:基于链表实现的可选有界或无界阻塞队列,支持多线程操作。
    • PriorityBlockingQueue:基于堆实现的无界阻塞队列,支持元素按优先级排序。
  2. 栈(Stack):

    • ConcurrentLinkedDeque:基于双向链表实现的无界非阻塞双端队列,可作为栈使用,支持高并发操作。
    • ArrayDeque:基于数组实现的无界双端队列,可作为栈使用,支持多线程操作。
    • LinkedBlockingDeque:基于链表实现的可选有界或无界双端队列,可作为栈使用,支持多线程操作。
  3. 说明
    阻塞队列,是一种特殊的队列,它在普通队列的基础上提供了两个附加功能

    (1)当队列为空的时候,获取队列中元素的消费者线程会被阻塞,同时唤醒生产者线程。

    (2)当队列满了的时候,向队列中添加元素的生产者线程被阻塞,同时唤醒消费者线程。
    有界:队列中能够容纳的元素个数,通常情况下是有界的,比如我们实例化一个ArrayBlockingList,可以在构造方法中传入一个整形的数字,表示这个基于数组的阻塞队列中能够容纳的元素个数。这种就是有界队列。
    无界:没有设置固定大小的队列,它的默认队列长度是Integer.Max_Value,所以我们感知不到它的长度限制。

ConcurrentLinkedQueue使用和方法介绍

定义

一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。

新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。
ConcurrentLinkedQueue<xxx> queue = new ConcurrentLinkedQueue<>();

offer和poll
offer(E e) :将指定元素插入此队列的尾部。
poll() :获取并移除此队列的头,如果此队列为空,则返回 null。

offer是往队列添加元素,poll是从队列取出元素并且删除该元素

peek() : 获取但不移除此队列的头;如果此队列为空,则返回 null

size or isEmpty

如果此队列包含的元素数大于 Integer.MAX_VALUE,则返回 Integer.MAX_VALUE。

需要小心的是,与大多数 collection 不同,此方法不是 一个固定时间操作。由于这些队列的异步特性,确定当前的元素数需要进行一次花费 O(n) 时间的遍历。

所以在需要判断队列是否为空时,尽量不要用 queue.size()>0,而是用 !queue.isEmpty()

<<方法摘要>>

boolean add(E e)

将指定元素插入此队列的尾部。
boolean contains(Object o)

如果此队列包含指定元素,则返回 true。
boolean isEmpty()

如果此队列不包含任何元素,则返回 true。
Iterator<E> iterator()

返回在此队列元素上以恰当顺序进行迭代的迭代器。
boolean offer(E e)

将指定元素插入此队列的尾部。
E peek()

获取但不移除此队列的头;如果此队列为空,则返回 null。
E poll()

获取并移除此队列的头,如果此队列为空,则返回 null。
boolean remove(Object o)

从队列中移除指定元素的单个实例(如果存在)。
int size()

返回此队列中的元素数量。
Object[] toArray()

返回以恰当顺序包含此队列所有元素的数组。
<T> T[] toArray(T[] a)

返回以恰当顺序包含此队列所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

相关推荐
咩咩啃树皮6 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦6 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚6 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-6 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-7 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白8 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司8 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地9 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun3141599 小时前
TCP超时重传机制是为了解决什么问题?
java
段一凡-华北理工大学10 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化