如何实现java.util.queue使用LIFO?

cel*_*owm 10 java queue collections fifo

在Java doc中:

[...]例外的是优先级队列,它根据提供的比较器对元素进行排序,或者元素的自然排序,以及对LIFO元素进行排序的LIFO队列(或堆栈)(后进先出)

如何实现java.util.queue使用LIFO而不是FIFO

Zhe*_*lov 19

您可以使用Collections.asLifoQueue方法将任何Deque用作LIFO队列:

Queue<Integer> arrayLifoQueue = Collections.asLifoQueue(new ArrayDeque<Integer>());
Queue<Integer> linkedListLifoQueue = Collections.asLifoQueue(new LinkedList<Integer>());
Run Code Online (Sandbox Code Playgroud)


Osc*_*mez 9

您可以使用java.util.LinkedList和使用pop()push()方法,并像堆栈一样使用它,这是一个LIFO队列.


小智 5

队列的实现可以基于FIFO优先级LIFO - 这就是官方文档所说的。

当程序员第一次看到“队列”时,他会自动认为“它一定是 FIFO 顺序”(或最终优先顺序)。但正如文档所说,必须有可能使用 Queue 接口进行 LIFO 排序。让我向您解释如何做到这一点。

// FIFO queue usage
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);

queue.remove(); // returns 1
queue.remove(); // returns 2

// LIFO queue usage
Queue<Integer> queue = Collections.asLifoQueue(new ArrayDeque<>());
queue.add(1);
queue.add(2);

queue.remove(); // returns 2
queue.remove(); // returns 1
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,根据实现的不同,Queue 接口也可以用作 LIFO。


Ale*_*exR 3

这里提供的Stack和LinkedList只是一个集合。队列不是集合。它是并发包的一部分,可以与线程池一起使用。

我刚刚再次验证并阅读了您引用的javadoc。我认为使用 LIFO 队列的唯一选择是使用带有自定义比较器的优先级队列,该比较器根据插入时间以相反的顺序比较元素。