【问题标题】:How do I instantiate a Queue object in java?如何在 java 中实例化 Queue 对象?
【发布时间】:2011-06-05 08:05:49
【问题描述】:

当我尝试时:

Queue<Integer> q = new Queue<Integer>();

编译器给了我一个错误。有什么帮助吗?

另外,如果我想初始化一个队列,我必须实现队列的方法吗?

【问题讨论】:

标签: java data-structures queue


【解决方案1】:

Queue in Java 被定义为一个接口,许多现成的实现作为 JDK 版本的一部分存在。 这里有一些: LinkedList、优先队列、ArrayBlockingQueue、ConcurrentLinkedQueue、链接传输队列、Synchronous Queue

所以您可以创建任何这些类并将其作为队列参考。例如

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {

 public static void main (String[] args) {
  Queue que = new LinkedList();
  que.add("first");
  que.offer("second");
  que.offer("third");
  System.out.println("Queue Print:: " + que);
  
  String head = que.element();
  System.out.println("Head element:: " + head);
  
  String element1 = que.poll();
  System.out.println("Removed Element:: " + element1);
  
  System.out.println("Queue Print after poll:: " + que);
  String element2 = que.remove();
  System.out.println("Removed Element:: " + element2);
  
  System.out.println("Queue Print after remove:: " + que);  
 }
}

您还可以实现自己的自定义队列实现队列接口。

【讨论】:

    【解决方案2】:

    队列是一个接口;你不能明确地构造一个队列。您必须实例化其实现类之一。比如:

    Queue linkedList = new LinkedList();
    

    Here's a link to the Java tutorial on this subject.

    【讨论】:

    • 这不再起作用了..!尽管此声明有效 --> Queue queue=new ArrayDeque();
    • @MdFaisal 使用 java 版本“1.7.0_71”对我来说很好
    【解决方案3】:

    Queue 是一个接口,这意味着你不能直接构造一个Queue

    最好的选择是构造一个已经实现Queue接口的类,例如以下之一:AbstractQueueArrayBlockingQueueArrayDequeConcurrentLinkedQueueDelayQueueLinkedBlockingQueueLinkedListPriorityBlockingQueuePriorityQueueSynchronousQueue

    另一种方法是编写自己的类来实现必要的 Queue 接口。除非在极少数情况下您希望做一些特别的事情,同时为程序的其余部分提供Queue,否则不需要它。

    public class MyQueue<T extends Tree> implements Queue<T> {
       public T element() {
         ... your code to return an element goes here ...
       }
    
       public boolean offer(T element) {
         ... your code to accept a submission offer goes here ...
       }
    
       ... etc ...
    }
    

    一个更少使用的替代方法是构造一个实现Queue 的匿名类。您可能不想这样做,但为了涵盖所有基础,它被列为一个选项。

    new Queue<Tree>() {
       public Tree element() {
         ...
       };
    
       public boolean offer(Tree element) {
         ...
       };
       ...
    };
    

    【讨论】:

    • 哦,亲爱的...我担心有人阅读本文会使用匿名Queue...但无论如何+1。
    • 其实乔恩的比较清楚。如果您更新它以提及并发并摆脱匿名类的代码,我会 +1...去做。 (即使他们想要自己的课程,也不需要匿名)
    • @Tom 没有取出匿名类信息,因为很高兴知道它是可能的,但我在它前面加上了“编写你自己的实现”,它与第一个列出的距离更远(更常见的)替代品。
    • 为什么不提ArrayDeque
    • 我在你提到的任何一个类中都找不到 enqueue() 方法,我只能找到 add() 方法,如果我错了,请纠正我。
    【解决方案4】:
    Queue<String> qe=new LinkedList<String>();
    
    qe.add("b");
    qe.add("a");
    qe.add("c");
    

    由于Queue是一个接口,你不能像你图示的那样创建它的实例

    【讨论】:

    • java.util.Queue 是一个接口。您不能实例化接口。您需要创建一个实现该接口的类的实例。在这种情况下,LinkedList 就是这样一个类。
    • @Tod yes 正在路上.. :)
    • 谢谢@JigarJoshi!!有没有办法用堆栈做同样的事情?我找不到任何东西。
    • @Zeh Stack&lt;String&gt; stack = new Stack&lt;&gt;(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
    【解决方案5】:

    Queue是java中的一个接口,你不能那样做。 试试:

    Queue<Integer> Q = new LinkedList<Integer>();
    

    【讨论】:

      【解决方案6】:

      Queue 接口扩展了 java.util.Collection,增加了额外的插入、提取和检查操作,例如:

      +offer(element: E): boolean // 插入元素

      +poll(): E // 获取元素,如果队列为空则返回NULL

      +remove(): E // 获取并移除元素,如果队列为空则抛出异常

      +peek(): E // 检索,但不删除此队列的头部,如果此队列为空,则返回 null。

      +element(): E // 检索但不删除此队列的头部,如果队列为空则抛出异常。

      实现队列的示例代码:

      java.util.Queue<String> queue = new LinkedList<>();
      queue.offer("Hello");
      queue.offer("StackOverFlow");
      queue.offer("User");
      
      System.out.println(queue.peek());
      
      while (queue.size() > 0){
          System.out.println(queue.remove() + " ");
      }
      //Since Queue is empty now so this will return NULL
      System.out.println(queue.peek());
      

      代码输出:

      Hello
      Hello 
      StackOverFlow 
      User 
      null
      

      【讨论】:

        【解决方案7】:

        队列是java中的一个接口,你不能那样做。

        相反,您有两个选择:

        选项1:

        Queue<Integer> Q = new LinkedList<>();
        

        选项2:

        Queue<Integer> Q = new ArrayDeque<>();
        

        我建议使用选项 2,因为它比其他选项快一点

        【讨论】:

          【解决方案8】:

          Queue 是一个接口。除了通过匿名内部类之外,您不能直接实例化接口。通常这不是你想为一个集合做的。相反,请选择现有的实现。例如:

          Queue<Integer> q = new LinkedList<Integer>();
          

          Queue<Integer> q = new ArrayDeque<Integer>();
          

          您通常会根据您感兴趣的性能和并发特性来选择集合实现。

          【讨论】:

          • 来自ArrayDeque:“这个类作为栈使用时可能比Stack快,作为队列使用时比LinkedList快”。这是由于 CPU 缓存友好的数据局部性和较少的分配频率。
          猜你喜欢
          • 1970-01-01
          • 2012-07-16
          • 2013-03-29
          • 1970-01-01
          • 1970-01-01
          • 2016-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多