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

WM.*_*WM. 140 java queue data-structures

当我尝试:

Queue<Integer> q = new Queue<Integer>();
Run Code Online (Sandbox Code Playgroud)

编译器给我一个错误.有帮助吗?

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

Edw*_*uck 146

A Queue是一个接口,这意味着您无法Queue直接构造.

最好的办法是建立关闭已经实现了一类Queue接口,像下面的一个:AbstractQueue,ArrayBlockingQueue,ArrayDeque,ConcurrentLinkedQueue,DelayQueue,LinkedBlockingQueue,LinkedList,PriorityBlockingQueue,或PriorityQueue.

另一种方法是编写自己的类来实现必要的Queue接口.除了极少数情况下你需要做一些特别的事情,同时为你的程序的其余部分提供一个SynchronousQueue.

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 ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

   public boolean offer(Tree element) {
     ...
   };
   ...
};
Run Code Online (Sandbox Code Playgroud)

  • 哦,亲爱的...我担心读这篇文章的人会使用一个匿名的"队列"......但是反正+1. (21认同)

Jon*_*eet 145

Queue是一个界面.除非通过匿名内部类,否则无法直接实例化接口.通常,这不是您想要为集合做的事情.而是选择现有的实现.例如:

Queue<Integer> q = new LinkedList<Integer>();
Run Code Online (Sandbox Code Playgroud)

要么

Queue<Integer> q = new ArrayDeque<Integer>();
Run Code Online (Sandbox Code Playgroud)

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

  • 来自[ArrayDeque](https://docs.oracle.com/javase/8/docs/api/java/util/ArrayDeque.html):"当用作堆栈时,此类可能比Stack快,并且速度更快比用于队列的LinkedList".这是由于CPU缓存友好的数据位置和较少的分配. (9认同)

Jig*_*shi 42

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

qe.add("b");
qe.add("a");
qe.add("c");
Run Code Online (Sandbox Code Playgroud)

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


zmf*_*zmf 15

Queue是一个接口,您无法显式构造Queue,您必须实例化其中一个实现类.就像是:

Queue linkedList = new LinkedList();
Run Code Online (Sandbox Code Playgroud)

^ h ERE是对Java教程链接在这个问题上.


dev*_*jay 12

在此输入图像描述

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

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

+poll(): E // 检索元素,如果queue为空,则返回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());
Run Code Online (Sandbox Code Playgroud)

输出代码:

Hello
Hello 
StackOverFlow 
User 
null
Run Code Online (Sandbox Code Playgroud)


小智 7

Queue是java中的一个接口,你不能这样做.

相反,你有两个选择:

选项1:

Queue<Integer> Q = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)

选项2:

Queue<Integer> Q = new ArrayDeque<>();
Run Code Online (Sandbox Code Playgroud)

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


lcl*_*lcl 5

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

Queue<Integer> Q = new LinkedList<Integer>();
Run Code Online (Sandbox Code Playgroud)


小智 5

Java中的队列被定义为一个接口,许多现成的实现作为JDK发布的一部分存在.以下是一些: LinkedList,Priority Queue,ArrayBlockingQueue,ConcurrentLinkedQueue,Linked Transfer Queue,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);  
 }
}
Run Code Online (Sandbox Code Playgroud)

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