1

私はJavaが初めてで、使用しようとしています:

public static ArrayBlockingQueue<String> qu=new ArrayBlockingQueue<>(900);
...
qu.enqueue(MyString);

また

public static Queue<String> qu=new Queue<>(900);
...
qu.enqueue(MyString);

Queue は、それは単なるインターフェースだと主張して叫びます。ArrayBlockingQueue はエンキューを受け入れません。私は何か基本的な間違いを犯している気がします。私の質問は次のとおりです。使用するたびにインターフェイスを実装する独自のキューを作成する必要がありますか、それとも準備ができている関数がありますか? はいの場合、何が間違っていますか? 2 番目の質問は、標準キュー サイズとは何ですか? 私が読んだ仕様から、私はそれが私が使用できる最大値であるに違いないと思いましたが、900は小さなアプリケーションにとって少し大きなスペースを取るものではありませんか?

4

3 に答える 3

2

インターフェイスのインスタンスを作成しようとしていますが、それを実装するクラスをインスタンス化する必要があります。このような:

public Queue<Integer> intQueue = new ArrayBlockingQueue<Integer>(10);

于 2013-07-12T21:34:18.467 に答える
1

の代わりにaddandを使用してください。offerenqueue

サイズ 900 の配列は小さく、心配する必要はありません。キューを保持できるようにするために必要な数の要素を使用します。

于 2013-07-12T21:23:48.627 に答える
1

Queueシングル スレッド アプリケーションのメンバーとしてお勧めするのは次のとおりです。

private final Queue<String> someLogicalName = new ArrayDeque<>();

これを分解しましょう。

修飾子は、このprivate宣言が表示されるクラス (またはクラスのインスタンス) のみがキューを操作できることを意味します。

final修飾子は、メンバーを再割り当てできないことを意味します。値を変更する予定がない場合は、final修飾子を使用してその仮定を明示的にしてください。コンパイラは、誤って仮定に違反したときに通知します。また、複数のスレッドが変数にアクセスする場合、それを作成することfinalは、すべてのスレッドがnull.

変数を として宣言しますQueue。これは、コードが動作するインターフェイスであるためです。実装クラスとして宣言しません。これにより、後で要件が変更されたときに実装タイプを変更できなくなる可能性があります。

名前quは何も教えてくれません。キューがいくつかある場合はどうなりますか?それらに「qu」、「qu2」、「qu3」という名前を付けますか? それはすぐに混乱を招く可能性があります。型ではなく、変数内の情報の役割を説明する論理名を選択します。

の実装クラスを見つけるにはどうすればよいQueueですか? ドキュメントを見てください。「すべての既知の実装クラス?」という見出しのセクションを参照してください。それらのほとんどは具象型であり、Queueインターフェースを満たします。それぞれのドキュメントを読んで違いを確認し、用途に適したものを選択してください。ほとんど Queueのコレクション型よりも多くの実装がありますが、必要なものを簡単に絞り込める命名パターンに従います。java.util.concurrent私はシンプルなシングル スレッド キューを選びましたが、スレッド プールを使用している場合は、おそらくパッケージからのキューが必要になるでしょう。

コンパイラはコンストラクターの型パラメーターを推測できるため、「ダイヤモンド演算子」を使用し<>て混乱を減らすことができます。

于 2013-07-12T21:58:43.133 に答える