【问题标题】:FIFO based Queue implementations?基于 FIFO 的队列实现?
【发布时间】:2012-04-30 02:51:54
【问题描述】:

我需要一个简单的 FIFO 实现队列来存储一堆整数(如果是泛型实现,我不介意)。

java.util 或 Trove/Guava 库中已经为我准备好了哪些内容?

【问题讨论】:

标签: java collections queue


【解决方案1】:

是的。 Queue

LinkedList 是最简单的具体实现。

【讨论】:

  • 请注意,Javadoc 列出了所有实现。另外,它上面的第二个链接到LinkedList
  • LinkedList 不是接口;这是一个显式的类。或者,ArrayDeque 通常更快。
  • 我不需要随时调整队列大小,元素的数量始终不变。
  • ArrayDeque 和 ArrayQueue 有区别吗?
  • 这实际上不是真的:根据javadoc Queue不一定是FIFO:docs.oracle.com/javase/7/docs/api/java/util/Queue.html。 LinkedList 可以用作队列,因为顺序是固定的。
【解决方案2】:

这里是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
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 要使ArrayDeque 用作队列 (FIFO) 而不是堆栈 (LIFO),您应该使用 addremove。如果您使用pushpop,它的行为就像一个堆栈。 (严格来说,removepop 是相同的,但由于 add/poppush/remove 听起来不太好,所以我们使用 add/removepush/pop。)
    【解决方案4】:

    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
    

    【讨论】:

      【解决方案5】:

      Queue 是在 Java 中扩展 Collection 的接口。它具有支持FIFO 架构所需的所有功能。

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

      有关示例方法的详细信息,您可以参考FIFO based Queue implementation in Java

      PS:以上链接指向我的个人博客,其中包含更多详细信息。

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2014-08-24
        • 1970-01-01
        • 2011-03-10
        • 2017-04-08
        • 2020-03-09
        • 2021-01-24
        相关资源
        最近更新 更多