3

LinkedBlockingDeque同じ非同時対応物がArrayDequeサイズ変更可能な配列に支えられている間、なぜ彼らが作ったのか疑問に思っています。

LinkedBlockingQueueのようなノードのセットを使用しますLinkedList(ただし、 を実装していませんList)。

を使用する可能性があることは承知していますArrayBlockingQueueが、 を使用したい場合はどうすればよいArrayBlockingDequeですか? なぜそのようなオプションがないのですか?

前もって感謝します。

4

1 に答える 1

2

これは、スタックオーバーフローに関する適切な質問ではない可能性があります。しかし、これらの実装について何か言いたいことがあります。

-> まず、特定のインターフェースに対して異なる実装を提供する理由に答える必要があります。インターフェイス A があり、その 2 つの実装があるとします。たとえば、B と C とします。これらの実装は、実装を通じて同じ機能を提供するとします。しかし、B は C よりもパフォーマンスが優れています。次に、2 つの理由を除いて、実装を削除する必要があります。

1. Backward Compatibility - marking as deprecated.
2. There is a specific scenario where we cannot use B implementation.

例えば:

HashMap と LinkedHashMap -> 順序付けられたキーが必要な場合は、LinkedHashMap を使用します。それ以外の場合は、HashMap を使用します (パフォーマンスを少し向上させるため)。

ArrayBlockingQueue と LinkedBlockingQueue 境界キューが必要な場合は、ArrayBlockingQueue を使用します。それ以外の場合は、LinkedBlockingQueue を使用します。

今あなたの質問LinkedBlockingDeque が存在するのに ArrayBlockingDeque がないのはなぜですか

まず ArrayDeque が存在する理由を見てみましょう。

ArrayDeque の Java ドキュメントから。

  • このクラスは、
  • {@link Stack} をスタックとして使用すると {@link LinkedList} よりも高速
  • キューとして使用する場合。

    また、ArrayDeque には容量制限がないことに注意してください。また、LinkedList 実装で使用されるように、head と tail の 2 つのポインターがあります。

したがって、 ArrayBlockingDeque があった場合

1. There would have been no Capacity Restriction, which we normally 
   get from ArrayBlockingQueue.

2. There would have guards to access to tail and head pointers
   same as in LinkedBlockingDeque and therefore no significant performance 
   gain over LinkedBlockingDeque.

したがって、ArrayBlockingDeque の実装は存在しないと結論付けます。これは、この実装が LinkedBlockingDeque を介して提供できるものは何もないためです。何かがあることを証明できる場合は、はい、実装が必要です:)

于 2013-07-18T06:13:12.180 に答える