ディレクトリ
1概要
2継承システム
1概要
一般に、Javaコンテナは、4つの部分に分けることができます。
- リストコレクション
- セットコレクション
- キューのコレクション
- 地図コレクション
セットの上記4種類に加えて、特別なツールがあります:
- ツール(イテレータイテレータ、列挙列挙クラス、配列とコレクション)
直感的な感覚を実行するために以下に示す概要図集
2継承システム
あなたが特定の収集システムを話し始める前に、私は基本的なクラス構造コレクションフレームワークを説明したいと思います。このコレクションのリストのコレクション、コレクションセットまたはマップの両方をベースとしているため。
- まず、トップレベルは、Collectionインタフェースです。
セットサイズ決意、コレクションを無駄に待っているか否かが判断される:コレクションは、インターフェースのような操作の最も基本的なセットを定義していることが分かります。リスト、セット、キューは、このインタフェースを継承します。
- その後、AbstractCollectionもCollectionインタフェースを継承しています。
抽象クラスで、このクラス名から分かります。実装を行うためのいくつかの一般的な方法インタフェースCollectionのAbstractCollection。たとえば、次の方法が空であるかどうかを決定する、素子等かどうかを決定することを含む方法。
AbstractCollectionインタフェースを継承することで、少ない不要なコード、たくさんの書き込みが可能コード抽象最も一般的に考えたデザインを。AbstractCollectionは、物事の他のすべてのセットは、この抽象クラスを継承してきた、最も基本的なカテゴリです。
2.1リストコレクション
、低速の変更、高速な読み取りはるかに少ない書き込みシーンの変化を読み取るように適応:リスト記憶された設定は、データ構造がによって特徴付けられるデータの順序集合です。次のようにリストコレクションクラスの継承構造は次のとおりです。
私たちは、コレクションとAbstractCollectionに加えて、我々はAbstractListリストインターフェイスと抽象クラスを持っていることがわかります。Collectionインタフェースを継承した抽象リストのコレクションの最上層であるListインタフェースは、実際には、コレクションを表します。AbstractListは抽象実装リストの集まりである、多くの一般的な操作を実装しています。
一覧コレクション全体を実装するには、赤、黄、緑と3つのブロックに分けることができます。黄色の部分はセットリストを達成するために、リストのスレッドセーフなバージョンがある一方、赤い部分がListコレクションの実装のリストである、緑色の部分は、達成するためのリスト一覧を組み合わせています。
2.1.1リストの実装
ArrayListにクラスのリストは、一般的に実装されている、基になる配列が実装されています。時間計算量を読み出し素子はO(1)であり、ライト素子修正時間の複雑さはO(N)です。ここでは、深さでは行わない、次のセクションで詳しく説明します。
2.1.2リストセキュリティの実装
ベクトルクラスリストは、非常に一般的に達成するために使用されている、とArrayListのデータ構造は非常に似ています。しかし、最大の違いは、それはArrayListのである:ベクターは、スレッドセーフですが、ArrayListにはスレッドセーフではありません。
Stackクラスは、ベクトルに基づいていますが、また、双方向のキューを達成するために。リストの実装後に進んでそのスレッドセーフ外、に加えてそう。
最後に、我々は、最も重要な実装クラスの一覧コレクションをまとめ、いくつかのとおりです。
- ArrayListの:古典的な達成のリストコレクション。
- ベクター:クラシックコレクション、スレッドセーフ、および対応のArrayListのリスト。
- スタック:スタックの古典的な構造を達成するために、最後のアウトのデータ構造。スレッドセーフのベクトルを、継承されています。
- LinkedListは:古典的なリンクリスト構造を実現しています。
2.1.3リストの実装
LinkedListのは、古典的なリンクリストの実装です。LinkedListの継承AbstractSequentialList抽象クラス。AbstractSequentialList抽象クラスは、抽象文字通り連続リストです。ここでの焦点は、
データ構造を示すシーケンシャル語、される連続(リスト)。コメントも意味源から見ることができます。
これを提供し、骨格実装クラス リストの 努力で、最小限に抑えるためのインタフェースは、このインタフェースを実装するのに必要なは、A「順次アクセス」データストア(例えばAはリストをリンク)。に裏打ちされた
(言い換え)あなたは連続ストレージ(リスト)を実装する場合リストは、その後、抽象クラスを使用すると、作業に十分なの多くを減らすことができます。
実際には、その名前から分かるように、実際にAbstractSequentialList、抽象連続リストを達成(リスト)です。これ以降のリストの実装を容易という、多くの作業を行うにはAbstractSequentialList抽象クラス。AbstractSequentialListを使用すると、リンクリストを実装する場合、あなたはそれだけの方法とサイズ反復子のメソッドを実装する必要があり、コメントから見ることができます。
2.2コレクションセット
セットの要素が重ならないコレクションに格納されますが、保存されたシーケンスが乱れています。以下は、Setクラスの継承セットの構成図です。
リストのコレクションと同様に、Setインタフェースは、Collectionインタフェースを拡張しています。A AbstractSet抽象クラスが実装セットのインタフェース、継承された抽象クラスAbstractCollection。この部分は全く同じとリストです。
セットを達成するように設定いずれかが(赤い部分)を達成するために順序付けされ、2つのブロックに分割することができるセットを設定し、他のハッシュは(黄色の部分)を達成された設定のコレクション。
2.2.1秩序実現(TreeSetの)
- たSortedSetインターフェイスは、インターフェイスセット、TreeSetの道具にSortedSetを拡張します。
私たちは、コレクションのセットの要素が乱れている知っている、とのインターフェースは、SetインタフェースにSortedSet順序付きコレクションに定義されています。TreeSetのはにSortedSetの実現です。
達成2.2.2ハッシュ(HashSetの、LinkedHashSetの)
HashSetのは、古典的なハッシュ実装Setインタフェースです。しかし、コレクションのセットの要素が挿入順序セットのコレクションを維持するために、人々はLinkedHashSetのを作成し、順不同です。リストに基づいてLinkedHashSetのHashSetのは、挿入順序を維持しています。
ここでは、すべてのリアライズセットコレクションを要約したものです。
- TreeSetの:セットのコレクションの実装を命じました。
- HashSetの:ハッシュセットコレクションの実装。
- LinkedHashSetの:ハッシュセットコレクションは、実装する要素の挿入順序を維持します。
2.3キューのコレクション
キューは、FIFOデータ構造によって特徴付けられる特別な直線状です。下に示すように、キューベースのアーキテクチャ:
まず、キュー・インタフェースは、Collectionインタフェースを拡張します。キュー・インターフェースは、このキュー・データ構造の定義された基本的な操作に基づいて操作の基本的なセットを持っています。我々は提供、世論調査を見ることができますし、他の方法は、キュー操作に固有のものです。
次に、キューを達成するためにAbstractQueue抽象インタフェース。キュー、追加のためのこのデータ構造は、アクションの削除要素は同じではありません。AbstractQueue抽象クラスでは再びキューの基本的な動作を実現します。例えば、メソッドのメソッドAbstractQueueを追加しAbstractListに追加異なる実装を有します。
上に示した、全体的な構造キュークラスは、赤、黄色二つの部分に分けることができます。赤は秩序実現のキュー・インタフェースの一部であり、実装クラスが優先度つきキュー。黄色の部分はのDeque(両端キュー)を達成することである、2 ArrayDequeのLinkedListと実装クラスがあります。
2.3.1秩序実現
AbstractQueue優先度つきキューは、抽象クラスの具象実装です。
優先度つきキュープライオリティキューは、サイズキュー要素によって再ソートことを示しています。コールPEEK()またはプール()メソッドの場合にヘッドがキューから削除された場合、キューの最初の要素に取り込まれたが、キューの最小構成要素を削除していません。
双方向を実現2.3.2
- まず、我々はのDequeインタフェースが表示されます。両端キュー(両端キュー)は、双方向キュー手段である、要素が頭や尾で動作させることができます。
- 最後に、私たちは、LinkedListはとArrayDequeの具体的な実現を見たDequeインタフェースです。
私たちが前に言っLinkedListのは、チェーンではありませんが、それは、双方向のキューです。したがって、LinkedListのリストとキューの二重の特性を有しています。ArrayDeque円形待ち行列は、下にあるアレイによって実現される双方向です。もっと、私たちは、キューのセクションで説明します。
最後に、我々はいくつかの一般的な実装クラスキューシステムを要約したものです。
- 優先度つきキュー:プライオリティキュー
- LinkedListの:双方向キューの実装
- ArrayDeque:双方向循環キューの実装
2.4地図コレクション
リストの地図コレクション、セット、キューは、実際には、キー/値のデータ構造に類似かなり異なっているです。
- まず、Mapインタフェースはトップレベルのインタフェースです。そして、リスト、セット、キューは同様に、Mapインタフェースの定義は、ハッシュテーブルのデータ構造の操作です。例えば、我々は一般的に、GET、のkeySetというように、置きます。
- 次に、抽象クラスがクラスAbstractMap。一覧など、AbstractMapの抽象実装Mapインタフェースと。上記のように、クラス全体マップの構造は、三緑、黄、赤のセットに分割することができます。
2.4.1ハッシュ達成
レッドは、ハッシュマップの実装の一部として見ることができます。
- クラスAbstractMapは、特定のカテゴリHashMapを持っています。HashMapのは、ハッシュベースのアルゴリズムAbstractMapの実現です。
- その後、のLinkedHashMapとWeakedHashMapは、HashMapを継承しました。
LinkedHashMapのHashMapはさらにハッシュマップにリンクされたリストの挿入配列要素として格納され、達成されます。あまりにも長い間、自動的に回復する場合は、弱参照がWeakedHashMapで引用無用:HashMapのがさらに達成され、その差はHashMapのあるWeakedHashMap。
2.4.2秩序実現
黄色は秩序実現の地図コレクションの一部として見ることができます。
- まず、SortedMapのインターフェイスは、Mapインタフェースを継承しています。セットと同じように、マップ要素が順番になっていない、のSortedMapは整然としたMapインタフェースの定義です。
- その後、NavigableMapのはSortedMapインタフェースを継承しています。NavigableMapのインターフェイスは、達成するために従うことは簡単見つけるためのロジックを定義します。
- 最後に、TreeMapのは、実現NavigableMapのインタフェースです。
実際には、TreeMapのは赤黒ツリーベースのMap実装です。
地図は、クラス全体の構造の半分を読んで、ここを参照してください。他の半分は、辞書ベースの実装(緑色部分)に基づいています。しかし、実際には地図辞書は現在放棄、古いです達成。私たちは、ソースコード内のコメントから、関連するヒントを見ることができます。
注:このクラスは廃止されました(廃止)の新しい実装はMapインタフェースを実装する必要がなく、このクラスを拡張するよりも..
このクラスは、放棄された、新しい実装ではなく、このクラスを拡張しないでMapインタフェースを実装する必要があります。
だから、辞書での実現のために、私たちは、詳細な説明をするつもりはありません。
ここでは、すべての実装クラスマップコレクションをまとめます:
- HashMapの:古典的なハッシュ実装の地図コレクション。
- LinkedHashMapは:HashMapのに基づいて、リストのメンテナンスの要素を挿入するために追加されます。
- WeakedHashMap:強い参照に基づいてのHashMapが弱くなります。
- ツリーマップ:順序地図コレクションを達成。
2.5ツール
ツールのセットがあります。イテレータイテレータ、反復子イテレータ、列挙列挙クラス、配列やコレクションクラス。
2.5.1イテレータイテレータ
アンイテレータはシーケンスをトラバースし、オブジェクトを選択するために使用されます。Javaのイテレータ一方向のみ移動。ArrayListの中で見ることができ、他のWeakHashMapコレクションクラスは、トラバーサルの種類を設定するには、このインタフェースを実装しています。
2.5.2反復子イテレータ
反復子は、Iteratorインターフェイスを継承し、それはそれは双方向の移動を可能にすることが、より強力な機能を備えています。しかし、その名前を見ることができる、それだけでリストコレクションを横断する適用することができます。
2.5.3 Enumeration 枚举类
これは、JDK 1.0インタフェースで導入されました。そして、ちょうどコレクションをイテレータとしての役割、。しかし、以下の列挙イテレータ機能。列挙のみでのHashtable、ベクトル、スタックで使用することができます。列挙は放棄されていないが、コードはほとんど使用されていないが、このインターフェースは、従来の反復子で置換されています。
公式文書では、Iteratorインターフェイスの代わりに、Enumerationインタフェースをお勧めします。
2.5.4配列
Java.util.Arraysクラスは、簡単に、それはすべてのメソッドは静的で提供し、配列を操作することができます。
2.5.3コレクション
様々なツールを含むjava.util.Collectionsは、多型の静的メソッド、サービングのJavaコレクションフレームワークに関連するオペレーションのセットです。
3概要
私たちは、リストのコレクション、セット、コレクション、地図のコレクション、キューのコレクションとイテレータやその他のツールを説明するために多くのスペースを費やしました。私たちは、ので、それらの間の関係をよりよく理解することを、クラス構造のこのセットの詳細な分析を行いました。
時々、私たちはあまりそれを暗く勉強したいです。私はHashMapのは、ああすることができ、唯一の共通のArrayListの友人を持っています。この質問については、私はいくつかの収穫を共有したいと思います。
まず、クラス間の差異を持つあなたがより身近にします。 我々は1つのまたは2つのクラスを使用する場合は、私たちは、いつ、どのようなタイプか分かりません。例:HashMapを使用する際に、時にハッシュテーブルを使用するには?イテレータは、役割は何ですかインターフェイス?JDKのソースが特徴である何という名前?
第二に、拡張するための便利なソース。 私たちは、物事のセットを詳細に調べるとき、私たちは、元は、このデータ型定義のリスト一覧インタフェースであることを知っている、と抽象のAbstractList一覧が達成されます。私たちは、カスタムリスト構造を実現したいのであれば、我々は、迅速な実装を実現するように、直接AbstractListクラスを継承することができます。しかし、あなたはそれの詳細な調査を持っていない場合は?多くのエネルギーがああを無駄にしたように、あなただけの、ゼロから書かれていてもよいです。あなたは、あなたが春を拡大するためには、ヘルプの良い源であり、このような方法で学びます。
次の記事では、我々は、各セットの特定の実装に飛び込むます。