首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在有界队列中使用数组作为数据结构是个坏主意?

在有界队列中使用数组作为数据结构可能是个坏主意,原因如下:

  1. 固定大小:数组的大小是在创建时确定的,无法动态调整。在有界队列中,如果数组大小不够,无法容纳更多的元素,导致队列无法继续添加新的数据。
  2. 内存浪费:由于数组的大小是固定的,如果队列中的元素数量较少,数组中的一部分空间将被浪费。这会导致内存的浪费,特别是当队列中的元素数量变化较大时。
  3. 插入和删除效率低:在数组中插入或删除元素时,需要移动其他元素来填补空缺或者调整位置。这个过程的时间复杂度为O(n),其中n是数组的大小。当队列中的元素数量较大时,这个操作会变得非常耗时。
  4. 队列满和队列空判断复杂:使用数组作为数据结构时,需要维护两个指针,一个指向队列的头部,一个指向队列的尾部。当队列为空时,这两个指针指向同一个位置;当队列满时,这两个指针也指向同一个位置。这样,判断队列是否为空或者队列是否已满的条件判断会变得复杂。

相比之下,使用链表作为数据结构可以解决上述问题。链表可以动态调整大小,不会浪费内存空间。插入和删除元素的效率较高,时间复杂度为O(1)。同时,链表的头部和尾部可以很容易地确定,判断队列是否为空或者队列是否已满的条件判断也更加简单。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java中常用的七阻塞队列介绍第一篇

Java中常用的七阻塞队列介绍第一篇 在上一篇我们对Java队列分类做了简单的介绍。本文咱们主要来聊聊阻塞队列的七常用子类。...所以通过源码分析我们可以对ABQueue得到如下总结: ABQueue结论: ArrayBlockingQueue:数据结构有界的阻塞队列。且默认使用非公平锁,也就是不保证线程公平访问队列的。...为什么说是有界的呢?因为我们知道数组大小有边界的。无论你声明的数组多大,最后都一极限的。存在大小限制,从源码,来看看向队列添加数据的方法: 为什么说默认不保证线程公平呢?...所以,从源码,我们可以得到如下总结: LBQueue结论: LBQueue使用链表结构的有界阻塞队列为什么说是有界的呢?我们来看看添加的元素的源码: 需要注意:千万别用默认的。...先来看看自定义的倒序排序器 来看看存放和获取后: ABQueue、LBQueue、PBQueue比较 名字 是否有界 数据结构 备注 ArrayBlockingQueue 有界数组 "初始化的时候需要给定队列大小

46820

Java中常用七阻塞队列的总结

Java队列总结 通过前面文章的学习,我们对Java中常用队列做了介绍。本文,咱们来对队列做个总结吧。 首先,我们介绍了现实生活的实际场景(排队买票等),来告诉我们为什么需要使用队列。...队列一种先进先出(FIFO)的抽象数据结构Java队列使用了两种数据类型来实现的,分别是:数组和链表这两种数据结构。...来分别说说每个队列的特点: ABQueue: 底层使用数组结构。因为数组需要初始化大小,所以其构造器需要输入队列的大小。 有界的阻塞安全队列(思考:为什么说是有界的?怎么保证线程安全的?)...,默认不保证线程的公平性(思考:为什么默认不能保证线程公平?如何保证线程安全?),不允许向队列插入null元素。 LBQueue: “有界”的阻塞安全队列,其底层使用链表的数据结构。...支持优先级应该底层使用PriorityQueue队列来实现的。而PriorityQueue队列添加元素的时候使用了siftUpComparable方法。这个对了的一特点:支持延时获取。

48400

构建高性能队列,你不得不知道的底层知识!

栈和队列,可以说是除了数组和链表之外最基础的数据结构了,很多场景中都有用到,后面我们也会陆陆续续的看到。 今天,我想介绍一下,Java,如何构建一高性能的队列,以及我们需要掌握的底层知识。...队列 队列一种先进先出(First In First Out,FIFO)的数据结构,类似于实际生活场景的排队,先到的人先得。 ?...使用数组和链表实现简单的队列,我们前面都介绍过了,这里就不再赘述了,有兴趣的同学可以点击以下链接查看: 重温四大基础数据结构数组、链表、队列和栈 今天我们主要来学习如何实现高性能的队列。...并发安全的队列 Java,默认地,也自带了一些并发安全的队列队列 有界性 锁 数据结构 ArrayBlockingQueue 有界 加锁 数组 LinkedBlockingQueue 可选有界...环形数组 通过上面的讨论,我们知道实现高性能队列使用数据结构只能数组,而数组实现队列,必然要使用到环形数组

65220

通俗易懂,JDK 并发容器总结

这是一Map,使用跳表的数据结构进行快速查找。...从名字可以看出,ConcurrentLinkedQueue这个队列使用链表作为数据结构.ConcurrentLinkedQueue 应该算是高并发环境中性能最好的队列了。...5.2 ArrayBlockingQueue ArrayBlockingQueue BlockingQueue 接口的有界队列实现类,底层采用数组来实现。...PriorityBlockingQueue 并发控制采用的 ReentrantLock,队列为无界队列(ArrayBlockingQueue 有界队列,LinkedBlockingQueue 也可以通过构造函数传入...而就查询的性能而言,跳表的时间复杂度也是 O(logn) 所以并发数据结构,JDK 使用跳表来实现一 Map。 跳表的本质同时维护了多个链表,并且链表分层的, ?

61730

读书笔记《Java并发编程的艺术 - 方腾飞》- 7种阻塞队列

文中出现代码来自 jdk 1.8 队列 FIFO(先进先出)的数据结构即为队列 阻塞队列 操作会被阻塞的队列即为阻塞队列, java BlockingQueue 接口 Queue 接口的基础上增加了两组阻塞方法...ArrayBlockingQueue[有界] 一使用数组实现的有界阻塞队列....LinkedBlockingQueue[有界] 一使用链表实现的有界队列 public LinkedBlockingQueue(int capacity) { if (capacity <=...PriorityBlockingQueue[无界] 一使用数组 + 比较器实现的优先级队列 这个队列使用了二叉堆排序的方式来实现优先级 关于这个队列的重点内容也是二叉堆排序上, 这里延伸的内容还是比较多的...这个队列没有容量的队列,所以调用方法上有一些不同。

74350

JDK容器学习之Queue: ArrayBlockingQueue

基于数组阻塞队列 ArrayBlockingQueue 前面学习了基于数组的非阻塞双端队列ArrayDeque,其内部维护一数组和指向队列头和队列尾索引的两成员变量;本篇则探究下基于数组的阻塞队列是什么样的数据结构...底层数据结构 先看内部成员变量定义, 和 ArrayDequeue相比,差别不大,一数组,两索引;此外多了一锁和两判定条件 /** The queued items */ final Object...,注释上并没有说明要求容量2的n次方(ArrayDequeue有这个强制限定) 初始化时必须指定队列的容量(即数组的长度,构造方法的必选参数) count直接表示队列的元素个数(注意DelayQueue...留一疑问,塞入队列超过数组容量,是否会出现扩容 数据结构如下图 !...Prefer 分析阻塞原理之前,先通过注释解释下ArrayBlockingQueue的使用场景 先进先出队列队列头的最先进队的元素;队列尾的最后进队的元素) 有界队列(即初始化时指定的容量,就是队列最大的容量

73260

Java核心(四)面试必备—你不知道的数据集合

四、Queue Queue(队列)与栈相对的一种数据结构。只允许一端进行插入操作,而在另一端进行删除操作的线性表。栈的特点后进先出,而队列的特点先进先出。...队列的用处很大,但大多都是在其他的数据结构,比如,树的按层遍历,图的广度优先搜索等都需要使用队列做为辅助数据结构。...ArrayBlockingQueue 底层数组有界队列,如果我们要使用生产者-消费者模式,这是非常好的选择。...LinkedBlockingQueue 底层链表,可以当做无界和有界队列使用,所以大家不要以为它就是无界队列。...PriorityBlockingQueue 无界队列,基于数组数据结构为二叉堆,数组第一也是树的根节点总是最小值。 ArrayBlockingQueue :一数组结构组成的有界阻塞队列

40820

BlockingQueue队列

【2】BlockingQueue 实现主要用于生产者-使用队列,但它另外还支持Collection 接口。因此,举例来说,使用remove(x) 从队列移除任意一元素有可能的。...因此,举例来说,只添加了c 的一些元素后,addAll(c) 有可能失败(抛出一异常)。...3、简要概述BlockingQueue常用的实现类 ArrayBlockingQueue 实现细节 1.基于数组实现循环队列: 也就意味着预分配了空间,不过基于数组性能上比基于链表的实现性能高些(CPU...3.一旦创建,大小固定,有界队列。比较适合作为有界缓冲。大小固定,也就不必纠结空间回收的问题了,这个优点也是缺点,看怎么理解了。...DelayedQueue 原理 1.延迟队列内部使用优先队列管理任务 2.使用availabe Condition条件来做唤醒 3.使用的heap数据结构(因为用的优先队列基于堆得) 应用场景 延迟任务

55410

深入探索Java并发编程:ArrayBlockingQueue详解

一、ArrayBlockingQueue概述 ArrayBlockingQueue基于数组有界阻塞队列。它在创建时需要指定队列的大小,并且这个大小之后不能改变的。...数据结构 ArrayBlockingQueue内部使用循环数组作为存储结构。它有两关键索引:takeIndex和putIndex,分别用于从队列取出元素和向队列添加元素。...限流:由于ArrayBlockingQueue有界队列,它可以用于实现限流功能。当队列已满时,新的请求会被阻塞或拒绝,从而保护系统免受过多的请求冲击。...避免队列存储大量数据:由于ArrayBlockingQueue基于数组的实现,每个元素都会占用一定的内存空间。因此,应避免队列存储大量数据,以减少内存消耗和垃圾回收的压力。...更可靠的方式使用特殊的结束信号或定期检查某个关闭标志来退出循环。 六、总结 ArrayBlockingQueueJava并发编程中一非常有用的数据结构

24810

Disruptor原理探讨

这个服务主要是作为游戏服务器的游戏逻辑部分,包括帧同步逻辑及其他游戏过程玩家产生的一些业务逻辑。...那为什么当初要选择使用Disruptor作为存储客户端发来消息的容器,为什么不直接使用Java本身自带的那些队列结构呢?...让我们看看Java里常用的线程安全的内置队列: 类 是否有界 是否加锁 底层数据结构 ArrayBlockingQueue 有界 加锁 数组 LinkedBlockingQueue 有界(2^31-1)...访问一long数组的时候,如果数组的一值被加载到缓存,它会自动加载另外7。因此你能非常快的遍历这个数组。事实上,你可以非常快速的遍历连续内存块中分配的任意数据结构。...* * CPU每次从主存拉取数据时,会把相邻的数据也存入同一cache line。 * * 访问一long数组的时候,如果数组的一值被加载到缓存,它会自动加载另外7

73610

还在用BlockingQueue?读这篇文章,了解下Disruptor吧

当然计算机世界队列属于一种数据结构队列采用的FIFO(first in firstout),新元素(等待进入队列的元素)总是被插入到尾部,而读取的时候总是从头部开始读取。...jdk中提供的线程安全的队列下面简单列举部分队列: 队列名字 是否加锁 数据结构 关键技术点 是否有锁 是否有界 ArrayBlockingQueue 数组array ReentrantLock...CAS 无锁 无界 我们可以看见,我们无锁的队列无界的,有锁的队列有界的,这里就会涉及到一问题,我们真正的线上环境,无界的队列,对我们系统的影响比较大,有可能会导致我们内存直接溢出,所以我们首先得排除无界队列...其次还剩下ArrayBlockingQueue,LinkedBlockingQueue两队列,他们两都是用ReentrantLock控制的线程安全,他们两的区别一数组,一链表,队列,一般获取这个队列元素之后紧接着会获取下一元素...long的变量的时候,他会把帮助再加载7,我们上面说为什么选择数组不选择链表,也就是这个原因,在数组可以依靠缓冲行得到很快的访问。

1.5K20

解读Java阻塞队列BlockingQueue的实现

(一)ArrayBlockingQueue介绍和实现原理分析 ArrayBlockingQueue基于数组实现的有界的先进先出的阻塞队列,所以我们可以说队列的头部队列呆的时间最长的或者叫最早的,...数组实现的阻塞队列可以充当典型的有界的buffer队列,因为其长度固定,一旦创建就不能变化,队列满了或者空了对应的生产者和消费者都会进入阻塞状态,此外数组队列还提供了可选的公平性策略,默认情况下是非公平...注意扩容新生成一容量更大的数组,等生成完毕之后,还是需要以独占锁的方法,先替换引用,然后拷贝老数组的数据到扩容后的数组。...队列来存储相关的数据,这个优先级队列底层使用的也是二叉堆构建的数组数据结构,其中DelayQueue的泛型限制了其类必须继承了Delayed这个类本身或者子类,插入的时候一有序的二叉堆便已经生成...(六)SynchronousQueue的介绍和实现原理分析 这个队列之前的文章中分析,SynchronousQueue不存储实际的元素,仅仅是维护了两线程队列生产者,一消费者,采用类似CSP

5.1K31

2018-08-02 你应该知道的高性能无锁队列Disruptor你应该知道的高性能无锁队列Disruptor1.何为队列2.jdk队列3.Disruptor4.Log4j的Disruptor最

当然计算机世界队列属于一种数据结构队列采用的FIFO(first in firstout),新元素(等待进入队列的元素)总是被插入到尾部,而读取的时候总是从头部开始读取。...jdk中提供的线程安全的队列下面简单列举部分队列: 队列名字 是否加锁 数据结构 关键技术点 是否有锁 是否有界 ArrayBlockingQueue 数组array ReentrantLock...否 链表 CAS 无锁 无界 我们可以看见,我们无锁的队列无界的,有锁的队列有界的,这里就会涉及到一问题,我们真正的线上环境,无界的队列,对我们系统的影响比较大,有可能会导致我们内存直接溢出...其次还剩下ArrayBlockingQueue,LinkedBlockingQueue两队列,他们两都是用ReentrantLock控制的线程安全,他们两的区别一数组,一链表,队列,一般获取这个队列元素之后紧接着会获取下一元素...long的变量的时候,他会把帮助再加载7,我们上面说为什么选择数组不选择链表,也就是这个原因,在数组可以依靠缓冲行得到很快的访问。

84220

【面试题精讲】ArrayBlockingQueue 和 LinkedBlockingQueue 区别

ArrayBlockingQueue:基于数组实现的有界阻塞队列,它按照先进先出(FIFO)的原则对元素进行排序。...LinkedBlockingQueue:基于链表实现的可选有界或无界阻塞队列,它也按照先进先出(FIFO)的原则对元素进行排序。 2....为什么需要ArrayBlockingQueue和LinkedBlockingQueue? 多线程编程,我们经常需要使用队列来实现线程间的数据共享。...ArrayBlockingQueue ArrayBlockingQueue内部使用定长数组来存储元素,通过两指针分别指向队头和队尾。...ArrayBlockingQueue适合读写性能较高、固定容量的场景;而LinkedBlockingQueue适合插入和删除性能较高、可选有界或无界的场景。使用时需要根据具体需求选择合适的队列实现。

55540

【面试题精讲】ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?

ArrayBlockingQueue:基于数组实现的有界阻塞队列,它按照先进先出(FIFO)的原则对元素进行排序。...LinkedBlockingQueue:基于链表实现的可选有界或无界阻塞队列,它也按照先进先出(FIFO)的原则对元素进行排序。 2....为什么需要ArrayBlockingQueue和LinkedBlockingQueue? 多线程编程,我们经常需要使用队列来实现线程间的数据共享。...ArrayBlockingQueue ArrayBlockingQueue内部使用定长数组来存储元素,通过两指针分别指向队头和队尾。...ArrayBlockingQueue适合读写性能较高、固定容量的场景;而LinkedBlockingQueue适合插入和删除性能较高、可选有界或无界的场景。使用时需要根据具体需求选择合适的队列实现。

14420

JDK容器学习之Queue:LinkedBlockingQueue

基于链表阻塞队列LinkedBlockingQueue 基于链表的无边界阻塞队列,常用与线程池创建中作为任务缓冲队列使用 I....; } } 说明 底层结构为单向链表,其中队列头不包含有效数据; 队列长度有界,为初始化时指定的容量大小;没指定时,默认为int最大值 count实时表示队列中元素的个数,采用原子进行+/-1 进队和出队锁...Prefer 分析阻塞原理之前,先通过注释解释下LinkedBlockingQueue的使用场景 先进先出队列队列头的最先进队的元素;队列尾的最后进队的元素) 有界队列(即初始化时指定的容量,就是队列最大的容量...其他方法 除了出队和入队的方法之外,还有几个有意思的方法,如队列中元素以数组形式输出,判断队列是否有元素,这两操作,都会竞争出队和入队锁,确保执行这个方法时,队列不会被其他线程修改 public boolean...底层结构 ArrayBlockingQueue : 底层存储结构为数组,直接将数据存入数组 LinkedBlockingQueue : 底层存储结构为单向链表,会将数据封装到Node对象作为链表的节点

72260

【JUC进阶】11. BlockingQueue

2、BlockingQueue BlockingQueueJava从JDK5开始并发包(JUC)内引入的。他之所以适合作为数据交换共享的通道,关键在于他的Blocking上。...2.1、ArrayBlockingQueue ArrayBlockingQueue基于数组实现的有界阻塞队列,内部使用可重入锁来保证线程安全。...从官方文档可以看出,他有界队列,他会尝试put成满的队列的元件将导致操作阻挡;尝试take从空队列的元件将类似地阻塞。...由于其数组的特性,其容量初始化时就已指定,并且无法动态调整。 当有元素加入或离开队列时,总是使用takeIndex和putIndex两变量分别表示队列头部和尾部元素在数组的位置。...导入包后,我们可以使用以下方法 Java 创建数组阻塞队列: /** * capacity: 数组阻塞队列的大小 */ ArrayBlockingQueue animal = new

11710

50道Java集合经典面试题(收藏版)

值新增的一位零还是1,如果1这个元素数组的位置,数组的位置加原数组长度,如果零就插入到原数组。...扩容过程第二部一非常重要的方法transfer方法,采用头插法,把旧数组的元素插入到新数组。 HashMap大小为什么2的幂次方?...Queue队列,poll() 和 remove() 都是从队列取出一元素,队列元素为空的情况下,remove() 方法会抛出异常,poll() 方法只会返回 null 。...不使用泛型的时候,可以添加不同类型元素。 37. 为什么HashMapString、Integer这样的包装类适合作为key?...ArrayBlockingQueue: (有界队列数组实现的有界阻塞队列,按FIFO排序量。

86911
领券