【发布时间】:2012-04-30 02:51:54
【问题描述】:
我需要一个简单的 FIFO 实现队列来存储一堆整数(如果是泛型实现,我不介意)。
java.util 或 Trove/Guava 库中已经为我准备好了哪些内容?
【问题讨论】:
标签: java collections queue
我需要一个简单的 FIFO 实现队列来存储一堆整数(如果是泛型实现,我不介意)。
java.util 或 Trove/Guava 库中已经为我准备好了哪些内容?
【问题讨论】:
标签: java collections queue
是的。 Queue
LinkedList 是最简单的具体实现。
【讨论】:
LinkedList
LinkedList 不是接口;这是一个显式的类。或者,ArrayDeque 通常更快。
这里是java内置FIFO队列的使用示例代码:
public static void main(String[] args) {
Queue<Integer> myQ = new LinkedList<Integer>();
myQ.add(1);
myQ.add(6);
myQ.add(3);
System.out.println(myQ); // 1 6 3
int first = myQ.poll(); // retrieve and remove the first element
System.out.println(first); // 1
System.out.println(myQ); // 6 3
}
【讨论】:
ArrayDeque 可能是 JDK 中最快的基于对象的队列; Trove 有 TIntQueue 接口,但我不知道它的实现在哪里。
【讨论】:
ArrayDeque 用作队列 (FIFO) 而不是堆栈 (LIFO),您应该使用 add 和 remove。如果您使用push 和pop,它的行为就像一个堆栈。 (严格来说,remove 和 pop 是相同的,但由于 add/pop 或 push/remove 听起来不太好,所以我们使用 add/remove 和 push/pop。)
LinkedList 可以用作队列 - 但您需要正确使用它。这是一个示例代码:
@Test
public void testQueue() {
LinkedList<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
System.out.println(queue.pop());
System.out.println(queue.pop());
}
输出:
1
2
记住,如果您使用 push 而不是 add(您很可能会直观地这样做),这将在列表的前面添加元素,使其表现得像一个堆栈.
因此,只有与 add 结合使用时,这才是一个队列。
试试这个:
@Test
public void testQueue() {
LinkedList<Integer> queue = new LinkedList<>();
queue.push(1);
queue.push(2);
System.out.println(queue.pop());
System.out.println(queue.pop());
}
输出:
2
1
【讨论】:
Queue 是在 Java 中扩展 Collection 的接口。它具有支持FIFO 架构所需的所有功能。
对于具体实现,您可以使用LinkedList。 LinkedList 实现了Deque,后者又实现了Queue。所有这些都是java.util 包的一部分。
有关示例方法的详细信息,您可以参考FIFO based Queue implementation in Java。
PS:以上链接指向我的个人博客,其中包含更多详细信息。
【讨论】: