web-dev-qa-db-ja.com

キューの基本機能を備えた最速のJavaコレクションは何ですか?

Javaの最速のコレクションは何ですか?

追加と削除の操作が必要なだけです。順序は重要ではありません。等しい要素は問題ではありません。追加と削除以外は重要ではありません。

制限なしのサイズも重要です。

これらのコレクションには、彼の中にオブジェクトがあります。

現在、ArrayDequeを使用しています。これは、これがより高速なQueue実装であるためです。

67
Renato Dinhani

ArrayDequeが最適です。これをベンチマークした結果については、 this blog post に由来する このベンチマーク を参照してください。 ArrayDequeには、LinkedListにあるノード割り当てのオーバーヘッドも、ArrayListにある削除時に残っている配列の内容をシフトするオーバーヘッドもありません。ベンチマークでは、約3xだけでなく、大きなキューの場合はLinkedList、空のキューの場合はArrayListよりもわずかに優れています。最高のパフォーマンスを得るには、多くのサイズ変更を回避するために、一度に保持する可能性のある要素の数を保持するのに十分な初期容量を与えるとよいでしょう。

ArrayListLinkedListの間では、キューに常に含まれる合計要素の平均数に依存し、LinkedListは約10からArrayListに勝ちます要素。

84
ColinD

Java.util.LinkedListを使用できます。二重にリンクされており、暗号化されているため、一方の端に追加してもう一方の端から取得することはO(1)です。

どの実装を選択する場合でも、Queueインターフェースで参照し、ケースに合わない場合は簡単に変更できるようにします(もちろん、キューが必要な場合は)

更新:Colinの答えは、ArrayDequeが優れていると結論付けるベンチマークを示しています。両方ともO(1)操作がありますが、LinkedListは新しいオブジェクト(ノード)を作成しますが、これはわずかにパフォーマンスが向上します。両方ともO(1) = LinkedListを選択するのは間違っているとは思わない。

6
Bozho