Javaの基本(8):キュー(メソッドの詳細を含む)

Javaの例-キューの使用法

キューは、テーブルのフロントエンドでの削除操作とテーブルのバックエンドでの挿入操作のみを許可する特別な線形テーブルです。

LinkedListクラスはQueueインターフェースを実装しているため、LinkedListをキューとして使用できます。

Queueは、Javaでキューを実装するインターフェースです。メソッドは全部で6つしかなく、通常はそのうちの3つしか使用しません。Queueの実装クラスはLinkedListとPriorityQueueです。最も一般的に使用される実装クラスはLinkedListです。

キューの6つのメソッド分類:

プッシュ要素(追加):add()、offer()

同じ:容量を超えず、要素はキューの最後からプッシュされ、プッシュされた要素が返されます。
違い:容量を超えると、add()メソッドは例外をスローし、offer()はfalseを返します

ポップアップ要素(削除):remove()、poll()

同じ:容量が0より大きい場合は、削除して、行の先頭にある削除された要素を返します。
違い:容量が0の場合、remove()は例外をスローし、poll()はfalseを返します

ヘッド要素を取得します(削除されません):element()、peek()

同じ:容量が0より大きい場合、すべてが行要素の先頭に戻ります。ただし、削除されません。
違い:容量が0の場合、element()は例外をスローし、peek()はnullを返します。

基本的な収集操作に加えて、キューは(上記のように)固有の挿入、抽出、およびチェック操作も提供します。各メソッドには2つの形式があります。1つは例外をスローし(操作が失敗した場合)、もう1つは特別な値(操作に応じてnullまたはfalse)を返します。後者の形式の挿入操作は、容量が制限されたキューの実装用に特別に設計されています。ほとんどの実装では、挿入操作は失敗しません。

例外をスローする 特別な値を返す
インサート add(e) オファー(e)
削除 削除する() poll()
試験 素子() ピーク()

キューは通常(必ずではありませんが)FIFO(先入れ先出し)方式で要素をソートします。ただし、優先度付きキューとLIFOキュー(またはスタック)は例外であり、前者は提供されたコンパレータまたは要素の自然な順序に従って要素を並べ替え、後者はLIFO(後入れ先出し)方式に従って要素を並べ替えます。どのソート方法を使用する場合でも、キューの先頭は、remove()またはpoll()を呼び出すことによって削除される要素です。FIFOキューでは、すべての新しい要素がキューの最後に挿入されます。他のタイプのキューは、異なる要素配置ルールを使用する場合があります。すべてのキュー実装は、その順序属性を指定する必要があります。

可能であれば、offerメソッドは要素を挿入できます。それ以外の場合は、falseを返します。これは、チェックされていない例外をスローすることによってのみ要素の追加に失敗する可能性があるCollection.addメソッドとは異なります。オファー方法は、固定(制限付き)キューなどの異常な状況ではなく、通常の障害状況向けに設計されています。

remove()メソッドとpoll()メソッドは、キューの先頭を削除して返すことができます。どの要素がキューから削除されるかは、キューの並べ替え戦略の機能であり、この戦略はさまざまな実装で異なります。remove()メソッドとpoll()メソッドは、キューが空の場合にのみ異なる動作をします。remove()メソッドは例外をスローし、poll()メソッドはnullを返します。

element()とpeek()は戻りますが、キューの先頭は削除しません。

キューインターフェイスは、並行プログラミングで非常に一般的なブロッキングキューメソッドを定義していません。BlockingQueueインターフェースは、要素が表示されるのを待つ、またはキュー内の空き領域を待つメソッドを定義し、これらのメソッドはこのインターフェースを拡張します。

一部の実装(LinkedListなど)ではnullの挿入が禁止されていませんが、キューの実装では通常、null要素の挿入は許可されていません。nullを許可する実装でも、nullはpollメソッドの特別な戻り値としても使用され、キューに要素が含まれていないことを示すため、キューに挿入しないでください。

キューの実装は通常、equalsメソッドとhashCodeメソッドの要素ベースのバージョンを定義しませんが、ObjectクラスからIDベースのバージョンを継承します。これは、同じ要素で順序属性が異なるキューの場合、要素ベースの同等性が常に適切であるとは限らないためです。 -定義済み。

次の例は、キューの使用法を示しています。

Main.javaファイル

import java.util.LinkedList;
import java.util.Queue;
 
public class Main {
    
    
    public static void main(String[] args) {
    
    
        //add()和remove()方法在失败的时候会抛出异常(不推荐)
        Queue<String> queue = new LinkedList<String>();
        //添加元素
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d");
        queue.offer("e");
        for(String q : queue){
    
    
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
        for(String q : queue){
    
    
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("element="+queue.element()); //返回第一个元素 
        for(String q : queue){
    
    
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("peek="+queue.peek()); //返回第一个元素 
        for(String q : queue){
    
    
            System.out.println(q);
        }
    }
}

上記のコードの出力は次のとおりです。

a
b
c
d
e
===
poll=a
b
c
d
e
===
element=b
b
c
d
e
===
peek=b
b
c
d
e

おすすめ

転載: blog.csdn.net/weixin_43314519/article/details/107474121
おすすめ