コンテナ(コレクション)

序文

コレクションとコンテナの概念、人々は、私は、これは、このトピックの明確な理解が簡単な議論をつもりここになります持っていなかった、常に2年間の学習プログラムや仕事でいくつかの混乱しています:

0.容器

容器は、大別している
マップをキーと値のペアを保存する:
コレクション:に分ける:一つの要素記憶するために使用されるリストセットキュー(与えられていない図キューの一例)
点線のボックスインターフェース:破線のボックス:抽象クラス、固体ボックス:一般的なカテゴリ、粗フレーム:使用。
実線:クラスがクラスにポイントが生成されてもよい
破線:抽象クラスとの間のインタフェースの継承。
中空と点線矢印:抽象クラス実装インターフェース、または別のインターフェースを継承するインターフェース。
白い矢印付き実線:具象クラスが実装するインタフェース、又は他のクラスからクラス継承
実線の矢印は、行を点線:インタフェースが生成することができます別のインターフェイス、これは必然的に内部インターフェイス、またはに矢印ポイントを継承するためのインターフェースに依存すること。
フルコンテナ分類

概念容器(セット)

プログラミング言語からのコンテナ(セット) - -オブジェクト指向
まず、本書のJavaで思考のいくつかの言及(フォース版)から取られた最初の標識断片:

  • すべてのプログラミング言語は抽象化を提供します。問題の複雑さが抽象の種類や品質に直接依存する人々によって解決することができると考えられます。「抽象的である何?」「タイプ」とは、いわゆるアセンブリ言語は、基礎となる機械のわずかな抽象化です。次に、(などFORTRAN、BASIC、C、など)の多くは、いわゆる「不可欠」言語はアセンブリ言語の抽象化されてきました。アセンブリ言語の基礎で言語が大幅に改善されている、彼らはまだコンピュータの構造、およびパッケージに基づいて考慮すべき問題点を解決する問題ベースの構造を解く際に必要な主要な抽象を行っています。マシン・モデルを確立しなければならないプログラマどこに問題があるに位置して解決すべきモデルと実用上の問題(「問題空間、」(「解空間」の内部には、これはあなたがコンピュータなどの問題をモデル化している場所です)例えば、サービスとの間の関連付け)。このマッピングの確立が面倒ですが、これは、プログラミング言語固有の機能ではありません。
  • 表現の問題空間にプログラマ要素にツールを提供することにより、オブジェクト指向の方法は、さらなるステップを行きます。我々は、解空間における空間での要素とその表現に疑問だろう「オブジェクトを。」(あなたはまた、いくつかの要素が問題空間オブジェクトに同化することはできません必要)このアイデアの本質は次のとおりです。このプログラムは問題を記述するために自分自身ではなく解決策を実行しているコンピュータよりも、特定の問題に適用されたオブジェクトの新しいタイプを追加することによって行うことができます。したがって、あなたが読んで記述されたコード体系を解決すると同時に、また、問題の文をお読みください。より柔軟かつ強力な言語の抽象化である我々が使用前の言語と比較すると。
  • どのように多くの特定の問題を解決するために必要なオブジェクト、またはどのくらい彼らは生き残るだろう、とどのようにこれらのオブジェクトを格納するには、これらのオブジェクトを作成するために必要とされるどのくらいのスペース。このような情報は、実行時にのみ取得することができます。オブジェクト指向設計でソリューション:オブジェクトの別の型を作成します。オブジェクトのこの新しいタイプの他のオブジェクトへの参照を保持します。もちろん、あなたは同じ機能は、ほとんどの言語の配列型で使用されて達成することができますしかし、この新しいオブジェクトは、一般的に(また、Javaクラスライブラリのコレクションとして知られているが、別の意味で、「コレクション」は用語であるので、この本は「コンテナ」を使用します言葉である)コンテナと呼ばれ、任意の時点で展開するために必要とすることができますあなたはその中のすべてのものに対応するために自分を置きます。そのため、将来的には容器に入れているどのように多くのオブジェクトを知っている必要はありません、あなただけのコンテナオブジェクトを作成する必要があり、そしてそれは、すべての詳細を処理しましょう。
  • 幸いなことに、良いOOP言語は、開発キットの一部として、コンテナのセットを持っています。Javaライブラリでは、(保存配列用)リスト、地図(また、オブジェクト間の関係を確立するために、連想配列としても知られる)、セット(それぞれ例えば異なるニーズのための容器の様々なタイプを有します1つのオブジェクトのみのタイプ)と同様に、複数のメンバーキュー、木、スタックなどを保持しています。
  • 設計の観点からは、実際の必要性は、一連の問題を解決するために、操作することが可能です。コンテナのシングルタイプがすべての要件を満たすためならば、系列の異なる種類を設計する理由はありません。しかし、コンテナはまだ二つの理由のために、選択する必要があります。
  • まず、異なるコンテナは、インタフェースと外部の挙動の異なる種類を提供しています。キュースタックに比べても、インターフェイスと、リストセットの動作とは異なり、異なるインタフェースと動作を持っている、と。解決策の中で、彼らは他のコンテナよりもはるかに柔軟である可能性が高いコンテナのいくつかの種類を提供しています。
  • 特定の操作のための第二の異なるコンテナは異なる効率を有します。ArrayListのとLinkedListは:最高の例では、2つのリストを比較したものです。彼らは、同じインターフェイスと外部の挙動を有する簡単な手順ですが、彼らはかかる特定の操作のコストは程遠いです。ArrayListのでは、素子は、ランダムアクセス動作が一定の時間を要するであるが、LinkedListのために、アクセス素子のコストが高いことであるリストにランダムに選択された要素を移動させる必要が近いテーブルの端に、より長いそれがかかり。一方、あなたは中間のシーケンスの要素を挿入したい場合は、LinkedListのArrayListのコストよりも小さいです。操作の効率およびその他の操作、構造の基礎となる異なるシーケンスに従って、大きな差があります。私たちは、プログラムのLinkedListのメンバーの使用を開始することができ、システムのパフォーマンスにArrayListのに最適化されています。生成されたコードの最小値に低下した容器との間の変換時にインタフェースリスト、影響を抽象もたらしました。

回収容器の概念
指定容器やコレクションにJavaで思考では、実際に参照する他のオブジェクトを参照するオブジェクトの種類を保持することができるという、一つのことです。しかし、別の本の中で、そのタイトルが異なっていました。

フレーム図のセットの0002。

Javaのコレクションは4つのタイプに分けられます。

  • セット(セット):オブジェクトのコレクション、および方法の特定の一種で無重複オブジェクト乱れました。
  • リスト(リスト):オブジェクトのコレクションインデックスの位置に従って順序付け、複製オブジェクトが存在してもよいです。
  • キュー(待ち行列):FIFOの規則に従ってオブジェクトのコレクションには、重複したオブジェクトをソートすることができ;.
  • マップ(マッピング):セットの各要素は、キー(鍵)のペアを含み、オブジェクトの値(Value)はオブジェクト、キーオブジェクトの重複セットが存在しない、オブジェクトの値を繰り返すことができます。
  • ここで設定され、最も近い数学のインターフェースセット、両方ではないが、重複した要素が含まれています。Java APIでは、Collectionインタフェースはインタフェース、セット、リスト、およびすべてのキューのコレクションのサブセットを表します。Mapインタフェースは、Collectionインタフェースを継承しません。

イテレータ与コレクション

  • 反復子:それぞれ異なるデータ構造であるが、容器、その内容が共通の抽出のコレクションを、一般的に何かを持っているが、基礎となるデータ構造セットは、均一な入口の様々なセットを横断するように設けられている隠しIterartorインタフェースです。
    コレクションから図枠で見られるように、コレクションIteratorインターフェイスは、インターフェイスに依存します。
 java.util 
Interface Collection<E>
All Superinterfaces: Iterable<E> 
All Known Subinterfaces

これらは、コレクションのイテレータインターフェースインターフェースイテレータ継承知られ、APIで説明されているインタフェースの親インタフェース、スーパーインタフェースのセットです、あなたはインタフェースのIteratorクラスが実装コレクションを実装する必要があります。しかし、JDKのソースコード内:

public interface Collection<E> extends Iterable<E>
public interface Iterable<T> {
 
    /**
     * Returns an iterator over a set of elements of type T.
     * 
     * @return an Iterator.
     */
    Iterator<T> iterator();//只提供一个抽象方法,需要子类实现
}

反復可能なインタフェースのjava.langパッケージには、イテレータいるjava.utilパッケージには属しています。java.utilのパッケージ内のコレクションは、リスト、キュー、セットの3つのインターフェースは、java.utilパッケージです。

Setインタフェースは、Collectionインタフェースを拡張し、リスト、キューは、Collectionインタフェースは、反復処理可能インターフェースを拡張します。一覧、地図、セット、コレクションイテレータイテレータ()メソッドを定義して反復処理可能なインタフェースを継承し、イテレータがコレクションのメソッドの書き換えつまり、Collectionインタフェースの実装は方法イテレータすべてのサブクラスを持っているの実装を返します。オブジェクトイテレータインタフェースのインスタンス。例としては、イテレータはコレクションを横断してもよいです。

  • 質問:反復処理可能なインタフェースを実装する必要がありますなぜ、なぜそれインタフェースIteratorを実装していませんか?(投稿者:のhttp://liuyun025.iteye.com/blog/1321045)

そのような家族やセットリスト所有者としてJDKのコレクションクラス、見ては、反復処理可能インターフェースを実現しているが、直接Iteratorインターフェイスを実装していません。そうする瞬間が正当化されるためだと思います。
コアインターフェイスメソッドためイテレータ()またはのhasNext()は、次のイテレータの現在の反復の位置に依存します。

コレクションイテレータインターフェースを直接実装した場合、データ収集オブジェクトは、現在の反復の位置(ポインタ)を含有し、必然的に導きます。現在の反復が予め設定された位置ではないのでセットは、異なる方法の間で転送される場合、結果next()メソッドは予測不能になるであろう。

さらにインターフェースは、現在の反復の位置をリセットするために使用イテレータreset()メソッドを追加する場合を除きます。しかし、この瞬間、コレクション同時に現在の反復位置の存在のみ。反復処理可能な各コールはゼロカウントからイテレータを返し、ではありません。複数イテレータは互いに干渉する。

コレクションは、イテレータインターフェース1.Iterable親が別のインタフェースであるが、例えばIteratorインターフェイスを返すことが反復処理可能な方法があります

2.収集と実装イテレータは、内部サブインターフェースを有しており、メソッド呼び出しを対応するイテレータオブジェクトを返すことができるクラスのサブクラス

すべてのサブクラスの前記収集機能のためIteratable foreachのインターフェースはIteratableインターフェイス及びインプリメンテーションに依存内部イテレータクラス(LinkedListの反復子を(参照)とソースコードJDKのdescendingIterator())を実装する実装。いくつかの容器は、様々な異なるイテレータリターンを達成するために、反復方法によって実装内部クラスイテレータインターフェースを複数有しています。

コレクションと地図

破線は、一方向に1つのポインティングの依存関係がUMLモデルのクラス図に依存する、依存関係を表します。地図は、コレクションの実装であるコレクションを、依存しています。特定のJDKは、ソースを追跡することができます。
ノート・ポイントの地図コレクションで一部のJava ^ 7

  • 1.Map Collectionインタフェースを継承しません。

  • 2.Collectionsは、コレクションクラスのヘルパークラス用で、コレクションは、インターフェースです

  • 3.Collection素子を得るために()メソッドを取得しません。それが唯一の要素イテレータ()によって横断することができます。

  • 前記容器は、クラスのオブジェクト参照(ポインタオブジェクトに)、代わりに特定の位置にコピー先情報を保持します。

  • 5.Map要素は、キー配列、別々に抽出された値の配列であってもよいです。

キーシーケンスを抽出する使用のkeySet()は、生成されたすべてのキーがセットにマッピングします。

値()値抽出シーケンスを使用して、すべての値は、コレクションを生成するマップ。

なぜセット、世代のコレクションを生成しますか?つまり、キーは常に一意であるため、値が繰り返されることが可能です。

  • 設定インタフェースは新しい方法を導入しない6.Setとまったく同じインターフェースコレクションを持っているが、それはコレクションセットですが、それらの異なる振る舞い。
  • 7.mapインタフェースは新しいとオブジェクトではありません。HashMapの継承されたインタフェースの実装クラスマップ、新しいターゲットとすることができる、HashMapの地図キーは、ハッシュコードのパケット達成を使用することです。速い速度によって特徴づけ検索、欠点は、繰り返しの順序という保証するものではありません。

3.アレイの組

この文でTIJは:もちろん、あなたはほとんどの言語で使用できる機能の同じセットを達成するために、アレイのタイプを持っています次に、配列のセットは、それがどのような違いを生むのでしょうか?

  • メモリ長:
  • 配列の長さが固体である、配列の長さを変更する方法は、新しい配列に古い配列をコピーし、新しい配列を作成することです。
  • 可変長のセットは、自動的に要素の増加に応じて増加させることができる、要素が減少と共に減少します。
  • コンテンツストレージ:
  • アレイは、(オブジェクトの異なるタイプのアドレス値を格納することができる)のいずれかの基本データ型(格納された値)を格納することができ、及び参照データ型を格納することができます。
  • 基本データ型は、それぞれの包装ボックスに自動的に格納されている場合にのみ参照データ型のセットを格納し、(オブジェクトの種類は、アドレス値、異なっていてもよいです)。

配列のセットを比較すると、素晴らしいではありません意味、我々はさらなる議論の機会を持っています。

4.コード

コードJDKの参照元の具体的な詳細は、そこに入念な調査ではない、またはテキストの末尾に参考文献を参照してください。
たとえば:ArrayListクラスとその親AbstractListは、リスト<>インターフェースはちょうど人々がコアサブクラスが実装インターフェイスのソースコードを読むことをするとき知っているように、何も特別な効果を使用していますを達成しています。多くの人々のようにArrayListの実装Listインタフェースは、それがAbstractListの詳細を継承知らなくても、十分であることを知っています。

リファレンス

コレクション1.javaを説明し、豚等しい-Iqのiteratorメソッドを設定します

2.javaシリーズ(9)-authorの統合:u010800530

3.コレクション(コレクション)反復子(イテレータ)

コレクションとイテレータインターフェース:4.Javaはノート()セット

5.javaコレクション和イテレータ

コレクションとイテレータインターフェースの6.javaコレクション

いくつかのノートの地図コレクション7.Java



背中に書かれました

テキスト侵害した場合、私に連絡してください。

リリース7件のオリジナルの記事 ウォンの賞賛0 ビュー193

おすすめ

転載: blog.csdn.net/qq_41765518/article/details/103868903