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

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

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

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

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

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

相关搜索:为什么使用Session在高流量网站中存储状态是个坏主意?在React中,将文本作为道具传递给组件是一个好主意还是坏主意?在Redis中根据对象的两个属性进行查询时,使用哪种数据结构是正确的在Numpy中,如何使用项目数组作为向导来确定第二个数组中项目的索引?为什么在函数中传递一个字符数组作为参数,并试图在函数内部进行修改会显示分段错误?如何使用钩子将表单输入值作为数组的对象存储在react中的另一个文件中?在使用旧助手的Laravel中,当' value‘是一个数组,'default’是一个基本值时,如何检查old(' value ','default')的值?在Page类中,操作方法应该使用return type作为类名,还是使用void return type是一个好的做法?在树形数据结构中写一个程序,我必须写类名和用户定义的数据类型名为什么是一样的?我正尝试在java中打印一个数组,并且我需要使用公共的空intArray()作为方法如何使用C#驱动程序在MondoDB中编写强类型查询筛选器,其中一个数组是子数组或等于另一个数组?在Python中,为什么我的for循环只排除特定数字之前的数字,而该数字是数组中的最后一个数字?为什么在一个实例中php POST数组为空,而在另一个实例中填充,两者都使用XHR POST?为什么在createSlice中使用'push‘会将'3’添加到我的状态中,而不是追加一个数组?为什么我在使用web dev server的最新react中得到-组件似乎是一个函数错误-无状态组件?如何使用awk将文件中的每个单词替换为另一个单词(这些单词在awk中是作为命令行参数给出的)如果我在使用Arrays.sort()之后尝试打印ch[0]或排序字符数组中的任何随机字符,它给出一个空输出,因此输出是空的,为什么?在XSLT中,为什么我不能使用xsl:attribute设置value-of的select-attribute,什么是一个好的选择呢?为什么我不能为数组中的每个元素添加一个事件侦听器,而不是在使用knockout js时只添加最后一个React键-在列表中呈现2个重复项-如何避免相同的键警告,因为相同的项在不使用索引作为键的情况下是预期的?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

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

50020

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

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

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

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

    68020

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

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

    75950

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

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

    63930

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

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

    42820

    JDK容器学习之Queue: ArrayBlockingQueue

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

    75660

    BlockingQueue队列

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

    56210

    Disruptor原理探讨

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

    75610

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

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

    1.6K20

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

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

    54610

    解读Java阻塞队列BlockingQueue的实现

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

    5.3K31

    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,我们上面说为什么选择数组不选择链表,也就是这个原因,在数组可以依靠缓冲行得到很快的访问。

    88020

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

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

    77940

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

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

    16820

    JDK容器学习之Queue:LinkedBlockingQueue

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

    75060

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

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

    88611

    【JUC进阶】11. BlockingQueue

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

    14410
    领券