2013-07-02 3 views
14

QueueでArrayListを使用する基本的な引数の1つは、QueueがFIFOの動作を保証するということです。キュー上で配列を使用する場合

しかし、10個の要素をArrayListに追加して、0番目の要素から始まる要素を反復処理すると、要素が追加された順序と同じ順序で取得されます。したがって本質的に、これはFIFOの動作を保証します。

伝統的なArrayListと比較してQueueはとても特別ですか?

答えて

12

Queueインスタンスを渡した場合、反復してremove()を呼び出すと、FIFO順の要素を取得することがわかります。もしあなたにArrayListインスタンスを与えたら、そのような保証はできません。

は、一例として、次のコードを取る:

 ArrayList<Integer> list = new ArrayList<Integer>(); 
    list.add(5); 
    list.add(4); 
    list.add(3); 
    list.add(2); 
    list.add(1); 


    list.set(4,5); 
    list.set(3,4); 
    list.set(2,3); 
    list.set(1,2); 
    list.set(0,1); 

    System.out.println(list); 

私はあなたにこのリストを与えることになりました場合は、0から4までの私の反復は、あなたがFIFOの順序で要素を取得しないでしょう。

また、私は別の違いは抽象であると言います。 Queueインスタンスでは、インデックスについて心配する必要はなく、ArrayListがすべて提供されている必要がない場合は、これで考えることが簡単になります。

0

たとえば、Queueのメソッドpoll()およびremove()は、要素を取得してキューから削除します。

Queueインターフェイスの一部の実装(PriorityQueue)は、要素に優先度を設定し、この優先度のために要素を取得します。最後のケースでは、FIFOの動作以上のものです。

12

javadoc hereをご覧ください。主な違いはListで、いつでも任意の要素を見ることができます。キューでは、「次の」キューだけを見ることができます。

実際の列として、または食料品店で現金登録するための行として考えてください。あなたは中間または最後の男に次に支払うように求めません、あなたはいつも正面にいる人に尋ねます/最長で待っています。

一部のリストはキューであることに注意してください。例えば、LinkedListを見てください。

+0

をキューにArrayListのからのデータ構造を変更するのではなく、それを行うための方法はありません。あなたはarraylist(a.k.aランダムアクセス)でできるキューで何ができるのですか?逆ではありません – Victor

+3

それはあなたの見方によって異なります。コード内に食料品店舗ラインを実装しようとしていた場合、 'ArrayList'は、' Queue'のように便利な方法で次の顧客を得る方法がないので迷惑でしょう。 if(!list.isEmpty())list.remove(0); 'を実行する必要があります。私はむしろ 'queue.poll()'を読み書きしたいのです –

+0

なぜArraylistは次の顧客を簡単に獲得できないのですか? iter.next() – Victor

0

違いは、キューの場合、要素をFIFO順に引き出すことが保証されていることです。 ArrayListの場合、要素がどのような順序で追加されたか分かりません。どのように使用するかに応じて、ArrayListにFIFO順序を適用することができます。キューのラッパーを設計して、私が望む要素を引き出すことができました。

私が作ろうとしている点は、これらのクラスが何かをうまくするように設計されていることです。あなたはそれを使用する必要はありませんが、それは彼らが設計され、最適化されているものです。キューは要素の追加と削除に非常に優れていますが、それらを検索する必要がある場合は悪いです。一方、ArrayListsは要素を追加するのが少し遅くなりますが、簡単なランダムアクセスが可能です。ほとんどのアプリケーションでは表示されませんが、一方を選択するとパフォーマンスが低下することがあります。

4

ArrayListと比較して、キュー(FIFO、ランダムアクセスなし)に課される制限により、データ構造の最適化、並行性の向上、および呼び出されたときのより適切でクリーンな設計が可能になります。

最適化と並行性に関しては、消費者が消費者がそれを消費している間、プロデューサがキューを満たす一般的なシナリオを想像してください。このためにArrayListを使用した場合、素朴な実装では最初の要素が削除されるたびにArrayListにシフト演算が行われ、1つおきの要素を下に移動します。これは、リスト全体がシフト操作の期間中ロックされるので、特に並行処理では非常に非効率的です。

デザインに関しては、アイテムがFIFO形式でアクセスされる場合、キューを使用するとその意図は自動的に通信されますが、リストはそうではありません。このコミュニケーションの明確さは、コードの理解を容易にし、コードをより堅牢でバグのないものにする可能性があります。

0

はい!

私は、値を返すキューでpoll()メソッドとpeek()メソッドを使用していましたが、それぞれhead要素を削除して調べます。これらのメソッドは、操作が失敗した場合に特別な値nullを返しますremove()メソッドと同様に例外をスローすると、nosuchelement例外がスローされます。

参考:docs.oracle.com

0

はランダムなプロセスがランダムに配列リストを更新している状況を考えると、私たちは、FIFOでそれらを処理することになっていますか?

は絶対ので、この意味ではキューは、実際のArrayListはすでに...それはどんな新機能を追加していない私たちを与えたものを制限されて

関連する問題