JavaでQueueオブジェクトをインスタンス化するにはどうすればよいですか?


142

私がしようとすると:

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

コンパイラがエラーを出します。何か助け?

また、キューを初期化する場合、キューのメソッドを実装する必要がありますか?


2
キューはスレッドセーフである必要がありますか?
Peter Lawrey、2011年

回答:


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します。
トム・

1
実際、ジョンのほうが明確です。並行性について言及し、匿名クラスのコードを削除するように更新すると、+ 1します...ほぼ確実にしたくないので、何をすべきかを知りたい人にとって、混乱を招くと思います。それを行う。(彼らが自分のクラスを望んでいたとしても、匿名にする必要はありません)
トム

1
@Tomは、それが可能であることを知っているのは良いので、匿名のクラス情報を取得しませんでしたが、最初にリストされた(より一般的な)代替案から遠ざかるように、その前に「独自の実装を記述」しました。
エドウィンバック2011年

1
なぜ言及しないArrayDeque
JW.ZG 2016

あなたが言及したどのクラスでもenqueue()メソッドを見つけることができません。add()メソッドしか見つけることができません。間違っている場合は修正してください。
Sreekanth Karumanaghat

152

Queueインターフェースです。匿名の内部クラスを介さない限り、インターフェースを直接インスタンス化することはできません。通常、これコレクションに対して実行したいことではありません。代わりに、既存の実装を選択してください。例えば:

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

または

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

通常、関心のあるパフォーマンスと同時実行性の特性に基づいてコレクションの実装を選択します。


9
ArrayDequeから:「このクラスは、スタックとして使用する場合はStackよりも高速であり、キューとして使用する場合はLinkedListよりも高速です」。これは、CPUキャッシュに適したデータの局所性と割り当て頻度の低下によるものです。
Vadzim 2016

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

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

以来Queueインターフェースであるあなたが示すように、あなたはそれのインスタンスを作成することはできません。


1
java.util.Queueインターフェースです。インターフェイスをインスタンス化することはできません。そのインターフェースを実装するクラスのインスタンスを作成する必要があります。この場合、LinkedListはそのようなクラスです。
Mihai Toader、2011年

@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;
Joshi

15

キューはインターフェースです。明示的にキューを作成することはできません。その実装クラスの1つをインスタンス化する必要があります。何かのようなもの:

Queue linkedList = new LinkedList();

これは、このテーマに関するJavaチュートリアルへのリンクです。


これはもう機能していません。この宣言は機能していますが-> Queue <Character> queue = new ArrayDeque <Character>();
Md Faisal

@MdFaisalはJavaバージョン "1.7.0_71"で
問題なく動作します

12

ここに画像の説明を入力してください

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

QueueはJavaのインターフェースであり、それを行うことはできません。

代わりに、2つのオプションがあります。

オプション1:

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

オプション2:

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

他より少し速いため、option2の使用をお勧めします


5

Javaのキューはインターフェースとして定義されており、すぐに使用できる実装の多くがJDKリリースの一部として提供されています。:ここではいくつかある LinkedListは、優先順位キュー、ArrayBlockingQueue、ConcurrentLinkedQueue、リンクされた転送キュー、同期キューなど

SOこれらのクラスを作成して、キュー参照として保持できます。例えば

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

QueueJavaのインターフェースですが、それはできませんでした。試してください:

Queue<Integer> Q = new LinkedList<Integer>();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.