基于FIFO的队列实现?


Answers:


86

是的 队列

LinkedList是最简单的具体实现。


5
注意,Javadoc列出了所有实现。另外,它上方的第二个链接是LinkedList
John B

2
LinkedList不是接口;这是一个显式类。或者,ArrayDeque通常更快。
Louis Wasserman

我不需要随时调整队列大小,元素的数量始终是恒定的。
Rajat Gupta 2012年

ArrayDeque和ArrayQueue有什么区别?
Rajat Gupta

3
实际上并非如此:根据javadoc,队列不一定是FIFO:docs.oracle.com/javase/7/docs/api/java/util/Queue.html。虽然顺序固定,但LinkedList可以用作队列。
Pieter Bos 2013年

59

这是使用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
}

14

ArrayDeque可能是JDK中最快的基于对象的队列;Trove具有TIntQueue接口,但是我不知道其实现在哪里。


8
ArrayDeque用作队列(FIFO)而不是堆栈(LIFO),应使用addremove。如果使用pushpop,它的行为就像一个堆栈。(严格地说,remove并且pop是相同的,但由于add/pop还是push/remove不健全的好对,我们去add/removepush/pop。)
ADTC

5

QueueCollection在Java中扩展的接口。它具有支持FIFO体系结构所需的所有功能。

对于具体的实现,您可以使用LinkedList。LinkedList实现Deque,该实现又实现Queue。所有这些都是java.util包装的一部分。

有关示例示例方法的详细信息,可以参考Java中基于FIFO的队列实现

PS:上面的链接转到我的个人博客,其中包含有关此主题的更多详细信息。


3

一个链表可以作为一个队列-但你需要使用它的权利。这是一个示例代码:

@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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.