在Java doc中:
[...]例外的是优先级队列,它根据提供的比较器对元素进行排序,或者元素的自然顺序,以及对LIFO元素进行排序的LIFO队列(或堆栈)(最后一个 - 出)
java.util.queue
的实施如何使用 LIFO 而不是 FIFO ?
答案 0 :(得分:18)
您可以使用Collections.asLifoQueue方法将任何Deque用作LIFO队列:
Queue<Integer> arrayLifoQueue = Collections.asLifoQueue(new ArrayDeque<Integer>());
Queue<Integer> linkedListLifoQueue = Collections.asLifoQueue(new LinkedList<Integer>());
答案 1 :(得分:9)
您可以使用java.util.LinkedList
并使用pop()
和push()
方法,并像堆栈一样使用它,这是一个LIFO队列。
答案 2 :(得分:4)
这里提供的Stack和LinkedList只是一个集合。队列不是一个集合。它是并发包的一部分,可以与线程池一起使用。
我刚刚再次验证并阅读了您引用的javadoc。我认为使用LIFO队列的唯一选择是使用优先级队列和自定义比较器,它们按照相反的顺序根据插入时间比较元素。
答案 3 :(得分:3)
Deque可以用作LIFO或FIFO
答案 4 :(得分:2)
队列是一种使用先进先出技术的数据结构。
这是一个有用的链接:magi.toolkit.util.queue Class LIFOQueue
“后进先出”队列的实现。基本上是一个LIFO 队列是一个堆栈。
答案 5 :(得分:2)
队列 的实现可以基于 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
如您所见,具体取决于实现方式,Queue接口也可以用作LIFO。
答案 6 :(得分:0)
我制作了一个大小有限的LIFO队列。通过将最旧的条目替换为新的条目来保持大小限制。该实现基于LinkedList。
package XXXX;
import java.util.LinkedList;
public class LIFOQueueLimitedSize<E> extends LinkedList<E> {
/**
* generated serial number
*/
private static final long serialVersionUID = -7772085623838075506L;
// Size of the queue
private int size;
// Constructor
public LIFOQueueLimitedSize(int crunchifySize) {
// Creates an ArrayBlockingQueue with the given (fixed) capacity and default access policy
this.size = crunchifySize;
}
// If queue is full, it will remove oldest/first element from queue like FIFO
@Override
synchronized public boolean add(E e) {
// Check if queue full already?
if (super.size() == this.size) {
// remove element from queue if queue is full
this.remove();
}
return super.add(e);
}
}