web-dev-qa-db-ja.com

JavaコレクションのQueueクラスはどこにありますか?

キューインターフェイスしか表示されませんが、Javaコレクションにキュークラスはありませんか?

23
Sinister

JavadocQueueを実装するクラスのリストを提供します。

すべての既知の実装クラス:

AbstractQueueArrayBlockingQueueArrayDequeConcurrentLinkedQueueDelayQueueLinkedBlockingQueueLinkedBlockingDequeLinkedListPriorityBlockingQueuePriorityQueueSynchronousQueue

役立つと思われるサブインターフェイスもいくつかあります。

すべての既知のサブインターフェイス:

BlockingDeque <E>、 BlockingQueue <E>、 Deque <E>

35
Michael Myers

キューには複数の実装があります:APIから:

すべての既知の実装クラス:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, 
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, 
PriorityBlockingQueue, PriorityQueue, SynchronousQueue

AbstractQueueは具体的なクラスではないことに注意してください。

これらの一部は並行パッケージからのものであるため、ジョブキューなどを実装している場合は、たとえば、ConcurrentLinkedQueueまたはPriorityBlockingQueue(ヒープの場合)を使用する必要があります。

10
akappa

Queue のドキュメントには、次のようなさまざまな実装がリストされています。

ニーズに合った実装を選択してください。

7
Rob
    Queue<Integer> queue = new ArrayDeque<>();

    queue.add(1);
    queue.add(2);
    queue.add(3);

    while (!queue.isEmpty()) {
        System.out.println(queue.remove());// prints 1 2 3
    }

LinkedListを使用することもできます。ただし、一般的に、キューの場合、LinkedListよりもArrayDequeが優先されます。 ArrayDequeはより少ないメモリを消費し、より高速で、nullを許可しないためです。 nullを許可しないのは良いことです。なぜなら、nullを許可すると、peek()またはpoll()を実行すると、キューが空でなくてもnullを取得する可能性があるからです。

3
developer747

いいえ、Queueクラスはありません。キューを実装する方法はたくさんあり、ユースケースに合ったものを選択する必要があるためです。同じことがコレクションフレームワークの他のコレクションにも当てはまります。たとえば、ArrayListLinkedListはどちらもListを実装します。オブジェクトの継承をうまく利用する一般的なパターンは次のとおりです。

インターフェース、例: Queueは、オブジェクトに果たす役割を定義します。

サブインターフェース、例: Dequeは、役割をさらに拡張または特殊化します。この場合、「両端キュー」または両端キューを使用すると、キューの両端に要素を追加したり、キューの両端から要素を削除したりできます。前面から取り外します。

クラスオブジェクトが役割を実行する方法の実装を提供します。たとえば、ArrayDequeはサイズ変更可能な配列を使用して、リンクリストを使用するLinkedListとは長所と短所が異なる両端キューを実装します。

役割としてのインターフェースの概念を詳しく説明するために、ArrayDequeDequeを実装しますが、実装するため、それを心配することなくQueueとして使用できることに注意してください。両方のインターフェースは、両方の役割を果たすことができることを意味します。同様に、LinkedListListQueue、またはDequeの帽子をかぶることができます。

このため、Collectionsフレームワークのようなものを使用する通常の(推奨される)方法は、インターフェイスにプログラムすることです、つまり、クラスではなくクラスを使用するときにインターフェイスを使用します名前自体。たとえば、次のようなオブジェクトをインスタンス化します。

Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");

このようにあなたは

  • 特定のクラスに関連付けられておらず、多くのコードを変更することなく、必要に応じてドロップイン置換を使用できます。
  • クラスが果たす役割に名前を付けて、クラスで何をしているかを文書化しています。これが役立つ一般的な原則は、自己文書化コードです。これは、基本的に、コメントなどを使用せずにコード自体を自明にすることです。
3
Injektilo

APIドキュメントを使用して「すべての既知の実装クラス」を見つけるだけでなく、パブリックAPIを介して利用できる他の非パブリック実装がよくあります(無意味なドキュメントの連なりを必要としない場合のみ)。 「 se 」をクリックすると、 Collections.asLifoQueueDequeはすでにQueueですが、FIFO)。

答えは軽蔑のように聞こえますが、実際には釣り方を教えてくれるのでかなりクールです。キューは単にコレクションを確認する方法であるため、多くのコレクションがそれを実装している可能性があります。同様に、コレクションのように機能するが、特定の他のロジック(スレッドキューなど)を持つものは、同じインターフェイスを使用する場合があります。

Javadocsをどこで見るかを知ることは大きな助けになります。あなたは見たと思いますが、実装を見ようとは思わなかっただけです。生活し、学びます。

サブクラス/拡張リストを追跡する必要がある場合もあります。 Queueを見てAbstractQueueを見た場合のように、どのクラスがそれを実装しているかを確認したい場合があります。

私はあなたの-1の1つをあなたのために取り除きます:)

2
Bill K

http://Java.Sun.com/javase/6/docs/api/Java/util/Queue.html -「すべての既知の実装クラス」のセクションを参照してください。さまざまな目的に適したさまざまな実装があります。

2
Dave Costa
import Java.util.Queue;

それだけ

Enqueue function == Queue_Object.add(input_value);

Dequeue function == Queue_Object.pull();   //return the value and delete it from queue
0
FoOzA