なぜjava.util.Stackを正式にはお勧めしません!

なぜJavaのスタック、それを使用することをお勧めしませんか?

スタックので、JDK 1.0の製品です。それは推奨されませんベクトル、ベクトルから継承された、あなたはスタックがお勧めだろうと言っているのですか?

すばやく操作のいくつかの基本的なデータ構造なので、もっとラフなカテゴリのいくつかの導入を導入することが可能で、開発JDK1.0を、持っていました。例えば、ベクター、スタック、ハッシュテーブルと上のようにします。これらのクラスプラスsynchronizedキーワード、簡単に使用中の誤解を作成するためのジュニアプログラマーの数の一部!そして、前にいくつかのバージョンでは、パフォーマンスがどのように良いではありません。

スタックスタックベクトルベースの実装。それはまだ根本的な配列であるので、まだ拡張が必要です。ベクトル・コレクション・クラスは、治療の大規模なコレクション方法を含む配列、によって実現されます。連続スタック理由のベクトル、ベクトル、実装プッシュ(プッシュ)、スタック(ポップ)の動作を多重化するための方法。ちょうどスタックを達成するためにため、スタック設計は、ここに悪い場所で、リンクされたリストだけでは達成できませんが、強制する最も簡単な方法を再利用するためには、それはそれは無関係されている可能性がベクタ、スタック、およびベクトルを継承しています。これは、ベクトル、ベクトルスタック継承するクラスは、スタックが設計に厳密ではないことができる多くの方法を、再利用することができるので、効率に基づいスタックアレイは、他の影響を受けることができます。

JavaはDeuqeを提供します。両端キューがキューから継承され、スタックは、Vectorから継承されます。JavaのDeuqeでは、略語「両端キューは、」Javaタイプのセットで両端キューです。使用は任意の障壁であってはならないので、両端キューFIFOの通常の機能を持つキューが、それはまた、スタックLIFOの機能を有しており、プッシュとポップな機能を保持しました。

ArrayDeque両端キューがインターフェイスの特定の実装を達成するための配列変数に依存しています。なし容量制約ArrayDeque、拡大が需要に応じて自動的に実行することができます。ArrayDequeスタックとして使用することができ、効率がスタックよりも高いです。ArrayDequeもまた良いはずです二重にリンクされたリストのLinkedListに比べ効率に基づいて、キューとして使用することができます。注、ArrayDequeがnull要素をサポートしていません。

オリジナルリンク:https://www.xttblog.com/?p=3416

基本的な実装のjava.util.Stackをについて

とき要素プッシュ:

public E push(E item) {
    addElement(item);
    return item;
}

しかし、実際にはaddElementのベクトルメソッドを呼び出します

public synchronized void addElement(E obj) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = obj;
}

ベクターおよび底部層は、要素が同様のArrayListの1.5倍の増殖、および成長を超えるたびアレイ、初期サイズ10の実現です。

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
    protected Object[] elementData;
    public Vector() {
      //初始大小为10
    this(10);
    }
    public Vector(int initialCapacity) {
    this(initialCapacity, 0);
    }
    public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
        //初始化为10
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
    ……
 }

要約:java.util.Stackをでは、底スタックアレイは、アレイ10の初期サイズを使用して実装されます。配列内の要素の数は、容量が1.5倍に拡大されて超えた場合、配列の元の要素は新しい配列にコピーされ、増加した素子のアレイ、これはオーバーヘッドも増加します。
Javaがjava.util.Stackをスタックを操作することをお勧めしますが、それを置き換えるために両端キュー「デック」を使用することをお勧めしていません。

「デック」について

public interface Deque<E>extends Queue<E>

これは、支持要素の両端のリニア収集、挿入および除去です。両端キュー名は、一般的として読ま略語で、「両端キュー(両端キュー)」、である「デッキ。」ほとんどのキューが、彼らは含めることができる要素の数には一定の制限を達成ませんが、このインターフェイスは、両方の容量制限のある両端キューをサポートし、何の固定サイズの制限の両端キューをサポートしていません。

両端キューインタフェース定義終了でアクセス要素にこの方法。要素の挿入、除去および検査を提供する方法。各方法は、2つの形態で存在する:操作が失敗した場合は、1つの形態は、リターンの別の形態(操作に応じヌルまたは偽)特殊な値を例外をスローします。インサートの後者の形態は、設計の容量制限のある両端キューの実装で使用するために設計され、ほとんどの実装では、挿入は失敗することはできません。
両端キューもLIFO(最後に、最初のアウト)スタックとして使用することができます。優先順位は、レガシーStackクラスの代わりにこのインタフェースを使用する必要があります。スタックの両端キューとして使用する場合、要素は両端キューの先頭にプッシュされ、両端キューの先頭から排出されます。この方法は、スタック方式のDequeとまったく同じです

おすすめ

転載: www.cnblogs.com/cosmos-wong/p/11845934.html