在阻塞队列中,我们是否有API来实现此要求,如果一个对象(比如一个String)在队列中,则返回它然后将其从队列中删除。
当然,我们可以循环队列并逐个执行if-else,如果不匹配,则将其放回队列。我们有更好的方法吗?
感谢。
答案 0 :(得分:1)
如果您只需要根据相等(equals
方法)进行比较,那么您可以使用BlockingQueue
的{{3}}方法删除对象。
E.g。
BlockingQueue<String> myQueue = new ArrayBlockingQueue<String>(10);
myQueue.add("hello");
myQueue.add("goodbye");
System.out.println("Queue contains goodbye: " + myQueue.contains("goodbye"));
myQueue.remove("goodbye");
System.out.println("Queue contains goodbye: " + myQueue.contains("goodbye"));
如果需要根据其他一些条件删除对象,则必须使用可用的迭代器迭代队列。根据特定的实现队列,迭代器可能支持也可能不支持remove
操作(检查特定类的文档)。 ArrayBlockingQueue
和LinkedBlockingQueue
都有支持remove
的迭代器,实际上ArrayBlockingQueue.remove(Object o)
的实现只是调用并使用它自己的迭代器和iterator.remove。
E.g。
BlockingQueue<String> myQueue = new ArrayBlockingQueue<String>(10);
myQueue.add("hello");
myQueue.add("goodbye");
System.out.println("Queue contains goodbye: " + myQueue.contains("goodbye"));
Iterator<String> iterator = myQueue.iterator();
while(iterator.hasNext())
{
if (iterator.next().contains("good")) iterator.remove();
}
System.out.println("Queue contains goodbye: " + myQueue.contains("goodbye"));
如果队列的迭代器支持remove
,那么这是一个比删除和重新添加所有其他队列元素(特别是基于链表的队列)更优化的解决方案。
答案 1 :(得分:0)
BlockingQueue接口及其所有实现都有一个名为remove(Object o)
的方法,它从该队列中删除指定元素的单个实例。您可以在存储字符串数据的BlockingQueue实现上使用此方法,并且可以删除一个对象。