1. ホーム

[解決済み】なぜスタックよりDequeを使うべきなのか?

2022-04-09 08:12:41

質問

を必要としています。 Stack データ構造を使用します。私はデータ構造にアイテムをプッシュすることができ、スタックから最後のアイテムだけを取り出したいと思っています。そのためには スタックに関するJavaDoc にはこうあります。

<ブロッククオート

より完全で一貫したLIFOスタック操作のセットがあります。 は、Deque インターフェースとその実装によって提供されるため、そちらを使用する必要があります。 このクラスよりも優先的に使用されます。例えば

Deque<Integer> stack = new ArrayDeque<>();

私はこのデータ構造をメソッドにローカルに使用する予定なので、ここで同期化された動作は絶対に必要ではありません。これとは別に、なぜ Deque よりも Stack ここで?

追伸:Dequeのjavadocによると、.

<ブロッククオート

Deques は LIFO (Last-In-First-Out) スタックとして使用することもできます。この インタフェースは、従来の Stack クラスよりも優先して使用されるべきです。

解決方法は?

ひとつには、継承の面でより理にかなっているということです。というのは StackVector は本当におかしいと私は思います。Java の初期には、継承が多用されていた IMO -。 Properties もその一例です。

私にとって、引用されたドキュメントの中で重要な単語は 一貫性 . Deque は、コレクションの先頭や末尾から項目を取得したり、追加したり、削除したり、反復したりすることができる操作のセットを公開しています - それだけです。位置によって要素にアクセスする方法は意図的に存在しません。 Stack 公開される というのも のサブクラスです。 Vector .

あ、あと Stack はインターフェイスを持たないので、もしあなたが Stack の操作は、特定の具象クラスにコミットすることになりますが、これは通常良いアイデアではありません。

また、コメントで指摘されているように StackDeque は、反復の順序が逆になっています。

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(new ArrayList<>(stack)); // prints 1, 2, 3


Deque<Integer> deque = new ArrayDeque<>();
deque.push(1);
deque.push(2);
deque.push(3);
System.out.println(new ArrayList<>(deque)); // prints 3, 2, 1

のJavaDocsでも説明されています。 Deque.iterator() :

この deque の要素に対するイテレータを、適切な順番で返します。要素は、最初 (head) から最後 (tail) までの順に返されます。