java中频繁的queue里添加数据没问题吧

java中频繁的queue里添加数据没问题吧,第1张

1 在一定程度上是没问题的

2 Java中的Queue是一个接口,具体的实现类有很多,比如LinkedList、ArrayDeque等。

这些实现类在向队列中添加元素时,都有相应的容量限制,当达到容量上限时就会抛出异常。

但如果频繁添加数据,可能会导致队列的长度变得很长,从而占用大量的内存空间。

3 如果需要频繁添加数据,可以考虑使用具有自动扩容功能的队列,比如PriorityQueue或ConcurrentLinkedQueue。

这些队列在添加数据时,会自动扩容以容纳更多的元素,从而避免了容量限制的问题。

java中的queue类是队列数据结构管理类。在它里边的元素可以按照添加它们的相同顺序被移除。

队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的头都是调用remove()或poll()所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个Queue实现必须指定其顺序属性。

offer 添加一个元素并返回true 如果队列已满,则返回false

poll 移除并返问队列头部的元素如果队列为空,则返回null

peek 返回队列头部的元素 如果队列为空,则返回null

put 添加一个元素 如果队列满,则阻塞

take移除并返回队列头部的元素 如果队列为空,则阻塞

element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常

add增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常

remove 移除并返回队列头部的元素如果队列为空,则抛出一个

NoSuchElementException异常

注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。

还有带超时的offer和poll方法重载,例如,下面的调用:

boolean success = q.offer(x,100,TimeUnit.MILLISECONDS)

尝试在100毫秒内向队列尾部插入一个元素。如果成功,立即返回true;否则,当到达超时进,返回false。同样地,调用:

Object head = q.poll(100, TimeUnit.MILLISECONDS)

如果在100毫秒内成功地移除了队列头元素,则立即返回头元素;否则在到达超时时,返回null。

阻塞 *** 作有put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。

Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。

Queue 叫队列,是数据结构中的一种,基本上所有成熟的编程语言都内置了对 Queue 的支持。

Python 中的 Queue 模块实现了多生产者和多消费者模型,当需要在多线程编程中非常实用。而且该模块中的 Queue 类实现了锁原语,不需要再考虑多线程安全问题。

该模块内置了三种类型的 Queue,分别是class queue.Queue(maxsize=0) , class queue.LifoQueue(maxsize=0)和class queue.PriorityQueue(maxsize=0) 。它们三个的区别仅仅是取出时的顺序不一致而已。

Queue 是一个 FIFO 队列,任务按照添加的顺序被取出。

LifoQueue 是一个 LIFO 队列,类似堆栈,后添加的任务先被取出。

PriorityQueue 是一个优先级队列,队列里面的任务按照优先级排序,优先级高的先被取出。

如你所见,就是上面所说的三种不同类型的内置队列,其中 maxsize 是个整数,用于设置可以放入队列中的任务数的上限。当达到这个大小的时候,插入 *** 作将阻塞至队列中的任务被消费掉。如果 maxsize 小于等于零,则队列尺寸为无限大。

向队列中添加任务,直接调用put()函数即可

put()函数完整的函数签名如下Queue.put(item, block=True, timeout=None) ,如你所见,该函数有两个可选参数。

默认情况下,在队列满时,该函数会一直阻塞,直到队列中有空余的位置可以添加任务为止。如果 timeout 是正数,则最多阻塞 timeout 秒,如果这段时间内还没有空余的位置出来,则会引发Full异常。

当 block 为 false 时,timeout 参数将失效。同时如果队列中没有空余的位置可添加任务则会引发Full异常,否则会直接把任务放入队列并返回,不会阻塞。

另外,还可以通过Queue.put_nowait(item)来添加任务,相当于Queue.put(item, False) ,不再赘述。同样,在队列满时,该 *** 作会引发Full异常。

从队列中获取任务,直接调用get()函数即可。

与put()函数一样, get()函数也有两个可选参数,完整签名如下Queue.get(block=True, timeout=None) 。

默认情况下,当队列空时调用该函数会一直阻塞,直到队列中有任务可获取为止。如果 timeout 是正数,则最多阻塞 timeout 秒,如果这段时间内还没有任务可获取,则会引发Empty异常。

当 block 为 false 时,timeout 参数将失效。同时如果队列中没有任务可获取则会立刻引发Empty异常,否则会直接获取一个任务并返回,不会阻塞。

另外,还可以通过Queue.get_nowait()来获取任务,相当于Queue.get(False) ,不再赘述。同样,在队列为空时,该 *** 作会引发Empty异常。

Queue.qsize()函数返回队列的大小。注意这个大小不是精确的,qsize() >0 不保证后续的 get() 不被阻塞,同样 qsize() <maxsize 也不保证 put() 不被阻塞。

如果队列为空,返回True,否则返回False。如果 empty() 返回True,不保证后续调用的 put() 不被阻塞。类似的,如果 empty() 返回False,也不保证后续调用的 get() 不被阻塞。

如果队列是满的返回True,否则返回False。如果 full() 返回True不保证后续调用的 get() 不被阻塞。类似的,如果 full() 返回False也不保证后续调用的 put() 不被阻塞。

queue.Queue()是 FIFO 队列,出队顺序跟入队顺序是一致的。

queue.LifoQueue()是 LIFO 队列,出队顺序跟入队顺序是完全相反的,类似于栈。

优先级队列中的任务顺序跟放入时的顺序是无关的,而是按照任务的大小来排序,最小值先被取出。那任务比较大小的规则是怎么样的呢。

注意,因为列表的比较对规则是按照下标顺序来比较的,所以在没有比较出大小之前 ,队列中所有列表对应下标位置的元素类型要一致。

好比[2,1]和["1","b"]因为第一个位置的元素类型不一样,所以是没有办法比较大小的,所以也就放入不了优先级队列。

然而对于[2,1]和[1,"b"]来说即使第二个元素的类型不一致也是可以放入优先级队列的,因为只需要比较第一个位置元素的大小就可以比较出结果了,就不需要比较第二个位置元素的大小了。

但是对于[2,1]和 1 [2,"b"]来说,则同样不可以放入优先级队列,因为需要比较第二个位置的元素才可以比较出结果,然而第二个位置的元素类型是不一致的,无法比较大小。

综上,也就是说, 直到在比较出结果之前,对应下标位置的元素类型都是需要一致的

下面我们自定义一个动物类型,希望按照年龄大小来做优先级排序。年龄越小优先级越高。

本章节介绍了队列以及其常用 *** 作。因为队列默认实现了锁原语,因此在多线程编程中就不需要再考虑多线程安全问题了,对于程序员来说相当友好了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7854382.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存