Java Queue的最佳实现?

2022-08-31 12:42:55

我正在研究(在Java中)递归图像处理算法,该算法从中心点向外递归遍历图像的像素。

不幸的是,这会导致堆栈溢出。因此,我决定切换到基于队列的算法。

现在,这一切都很好,很花哨 - 但是考虑到它的队列将在很短的时间内分析数千个像素,同时不断弹出和推送,而不保持可预测的状态(它可能在长度100到20000之间的任何地方),队列实现需要具有显着快速的弹出和推送能力。

链表似乎很有吸引力,因为它能够将元素推到自身上,而无需重新排列列表中的任何其他内容,但是为了使它足够快,它需要轻松访问它的头部和尾部(或者如果它没有双重链接,则需要轻松访问倒数第二个节点)。可悲的是,我找不到任何与Java中链接列表的底层实现相关的信息,所以很难说链接列表是否真的是要走的路......

这就引出了我的问题。对于我打算做的事情,Java中队列接口的最佳实现是什么?(我不希望编辑甚至访问队列的头部和尾部以外的任何内容 - 我不希望进行任何形式的重新排列或任何事情。另一方面,我确实打算做很多推送和弹出,队列的大小会改变很多,所以预分配会效率低下)


答案 1

用:

Queue<Object> queue = new LinkedList<>();

您可以使用将元素追加到队列的末尾,以及取消排队和检索队列的 head(第一个元素)。.offer(E e).poll()

Java定义了接口,LinkedList提供了一个实现。Queue

它还维护对 Head 和 Tail 元素的引用,您可以分别通过和尾部元素获得这些元素。.getFirst().getLast()


感谢@Snicolas建议队列接口


答案 2

如果您使用LinkedList,请小心。如果你像这样使用它:

LinkedList<String> queue = new LinkedList<String>();

然后你可以违反队列定义,因为可以删除除第一个以外的其他元素(LinkedList中有这样的方法)。

但是如果你像这样使用它:

Queue<String> queue = new LinkedList<String>();

这应该没问题,因为这提醒用户插入应该只在后面发生,删除只在前面发生。

通过将 LinkedList 类扩展到引发任何违规方法的 UnsupportedOperationException 的 PureQueue 类,可以克服队列接口的错误实现。或者,您可以通过创建纯队列来采用聚合方法,该字段只有一个字段,该字段的类型是LinkedList对象,列表,并且唯一的方法将是默认构造函数,复制构造函数,,,和。所有这些方法都应该是单行的,例如:isEmpty()size()add(E element)remove()element()

/**
* Retrieves and removes the head of this queue.
* The worstTime(n) is constant and averageTime(n) is constant.
*
* @return the head of this queue.
* @throws NoSuchElementException if this queue is empty.
*/
public E remove()
{
    return list.removeFirst();
} // method remove()

推荐