如何在Java中实例化Queue对象?


Answers:


151

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

最好的办法是建立关闭一类已经实现了Queue接口,像下面的一个:AbstractQueueArrayBlockingQueueArrayDequeConcurrentLinkedQueueDelayQueueLinkedBlockingQueueLinkedListPriorityBlockingQueuePriorityQueue,或SynchronousQueue

一种替代方法是编写您自己的类,该类实现必要的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) {
     ...
   };
   ...
};

21
哦,亲爱的...我怕有人读这篇文章时会使用匿名语Queue...但是无论如何还是+1。
汤姆(Tom)

1
实际上,乔恩(Jon's)更清楚。如果您更新它以提及并发性并摆脱匿名类的代码,我将对此+1。我认为对于想知道该怎么做的人来说,答案更加令人困惑,因为他们几乎肯定不想这样做去做。(即使他们想自己上课,也没有必要将其设为匿名)
汤姆(Tom

1
@Tom不会删除匿名类信息,因为很可能会这样做,但是我在它前面加上了“编写您自己的实现”,这使它与第一个列出的(更常见的)替代方法相距甚远。
埃德温·巴克

1
为什么不提及ArrayDeque
JW.ZG 2013年

在您提到的任何类中我都找不到enqueue()方法,我只能找到add()方法,如果我错了,请纠正我。
Sreekanth Karumanaghat

152

Queue是一个接口。除了通过匿名内部类,您不能直接实例化接口。通常,这不是您要为集合执行的操作。而是选择一个现有的实现。例如:

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

要么

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

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


9
来自ArrayDeque:“此类用作堆栈时,可能比Stack快,而用作队列时,则比LinkedList快”。这是由于CPU缓存友好的数据局部性和较少的分配频率。
Vadzim '16

42
Queue<String> qe=new LinkedList<String>();

qe.add("b");
qe.add("a");
qe.add("c");

由于Queue是一个接口,因此无法如图所示创建它的实例


1
java.util.Queue是一个接口。您不能实例化接口。您需要创建实现该接口的类的实例。在这种情况下,LinkedList就是此类。
Mihai Toader

@Tod yes在路上.. :)
Jigar Joshi

谢谢@JigarJoshi !! 有什么办法用堆栈做同样的事情吗?我什么都找不到。
ZehraSubaş18年

@ZehStack<String> stack = new Stack<>(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
Jigar Joshi

15

队列是一个接口;您不能显式构造一个队列。您必须实例化其实现类之一。就像是:

Queue linkedList = new LinkedList();

这是该主题的Java教程的链接。


这是行不通的..!尽管此声明有效-> Queue <Character> queue = new ArrayDeque <Character>();
法伊萨尔

@MdFaisal对我很好,带有Java版本“ 1.7.0_71”
zmf

12

在此处输入图片说明

Queue接口通过其他插入,提取和检查操作扩展了java.util.Collection,例如:

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

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

+remove(): E// 检索并删除元素,如果queue为空,则引发Exception

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

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

实现队列的示例代码:

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<>();

我建议使用option2,因为它比另一个更快


5

Java队列中的Queue被定义为接口,并且JDK版本中提供了许多现成的实现。这里有一些: LinkedList,Priority Queue,ArrayBlockingQueue,ConcurrentLinkedQueue,链接的传输队列,同步队列等。

因此,您可以创建这些类中的任何一个并将其保留为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);  
 }
}

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


4

Queue是Java中的接口,您不能这样做。尝试:

Queue<Integer> Q = new LinkedList<Integer>();
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.