Javaコレクションフレームワーク完全ガイド: インターフェース・実装クラス・アルゴリズム・イテレータ・Comparator
Java 2以前、JavaはDictionary、Vector、Stack、Propertiesなどのアドホックなクラスを提供してオブジェクトグループを格納・操作していました。これらのクラスは非常に有用でしたが、中央の統一的なテーマが欠けていました。したがってVectorの使用方法はPropertiesの使用方法とは異なっていました。
コレクションフレームワークは以下のような目標を達成するために設計されました。
- フレームワークは高性能でなければならない。基本コレクション(動的配列、連結リスト、ツリー、ハッシュテーブル)の実装は高効率でなければならない。
- 異なるタイプのコレクションが同様の方法で動作し、高度な相互運用性を持つことを可能にしなければならない。
- コレクションを容易に拡張・適応できるようにしなければならない。
この目的のため、コレクションフレームワーク全体は一連の標準インターフェースを中心に設計されています。これらのインターフェースのいくつかの標準実装(LinkedList、HashSet、TreeSetなど)が提供されており、そのまま使用したり、独自のコレクションを実装したりできます。
コレクションフレームワークとは、コレクションを表現・操作するための統一アーキテクチャです。すべてのコレクションフレームワークには以下が含まれます。
- インターフェース - コレクションを表す抽象データ型。インターフェースにより、コレクションをその表現の詳細から独立して操作できる。オブジェクト指向言語ではインターフェースは一般的に階層を形成する。
- 実装(クラス) - コレクションインターフェースの具体的実装。本質的には再利用可能なデータ構造。
- アルゴリズム - コレクションインターフェースを実装するオブジェクトに対して、検索やソートなどの有用な計算を実行するメソッド。アルゴリズムはポリモーフィックであると言われる:適切なコレクションインターフェースの多くの異なる実装で同じメソッドを使用できる。
コレクションに加えて、フレームワークはいくつかのマップインターフェースとクラスを定義します。マップはキー/値ペアを格納します。マップは厳密な意味ではコレクションではありませんが、コレクションと完全に統合されています。
コレクションインターフェース
コレクションフレームワークはいくつかのインターフェースを定義します。このセクションでは各インターフェースの概要を提供します。
| No. | インターフェースと説明 |
|---|---|
| 1 | Collectionインターフェース - オブジェクトグループを操作可能にする。コレクション階層のトップ。 |
| 2 | Listインターフェース - Collectionを拡張し、順序付きコレクションを格納するListのインスタンス。 |
| 3 | Setインターフェース - Collectionを拡張し、一意の要素を含むセットを扱う。 |
| 4 | SortedSetインターフェース - Setを拡張し、ソートされたセットを扱う。 |
| 5 | Mapインターフェース - 一意のキーを値にマッピングする。 |
| 6 | Map.Entryインターフェース - マップ内の要素(キー/値ペア)を記述する。Mapの内部クラス。 |
| 7 | SortedMapインターフェース - Mapを拡張し、キーを昇順で維持する。 |
| 8 | Enumerationインターフェース - コレクションオブジェクトの要素を列挙(1つずつ取得)するメソッドを定義するレガシーインターフェース。Iteratorに置き換わった。 |
コレクションクラス
Javaはコレクションインターフェースを実装する標準コレクションクラスのセットを提供します。一部のクラスはそのまま使用できる完全な実装を提供し、他は抽象クラスで、具象コレクションを作成するための骨格実装を提供します。
標準コレクションクラスを以下の表にまとめます。
| No. | クラスと説明 |
|---|---|
| 1 | AbstractCollection - Collectionインターフェースの大部分を実装 |
| 2 | AbstractList - AbstractCollectionを拡張し、Listインターフェースの大部分を実装 |
| 3 | AbstractSequentialList - 要素へのランダムアクセスではなくシーケンシャルアクセスを使用するコレクション向けにAbstractListを拡張 |
| 4 | LinkedList - AbstractSequentialListを拡張して連結リストを実装 |
| 5 | ArrayList - AbstractListを拡張して動的配列を実装 |
| 6 | AbstractSet - AbstractCollectionを拡張し、Setインターフェースの大部分を実装 |
| 7 | HashSet - ハッシュテーブルで使用するためAbstractSetを拡張 |
| 8 | LinkedHashSet - 挿入順イテレーションを可能にするためHashSetを拡張 |
| 9 | TreeSet - ツリーに格納されるセットを実装。AbstractSetを拡張 |
| 10 | AbstractMap - Mapインターフェースの大部分を実装 |
| 11 | HashMap - ハッシュテーブルを使用するためAbstractMapを拡張 |
| 12 | TreeMap - ツリーを使用するためAbstractMapを拡張 |
| 13 | WeakHashMap - 弱いキーを持つハッシュテーブルを使用するためAbstractMapを拡張 |
| 14 | LinkedHashMap - 挿入順イテレーションを可能にするためHashMapを拡張 |
| 15 | IdentityHashMap - AbstractMapを拡張し、ドキュメント比較時に参照等価性を使用 |
AbstractCollection、AbstractSet、AbstractList、AbstractSequentialList、AbstractMapクラスは、コアコレクションインターフェースの骨格実装を提供し、それらの実装に必要な労力を最小限に抑えます。
前章で説明したjava.utilで定義される以下のレガシークラス:
| No. | クラスと説明 |
|---|---|
| 1 | Vector - 動的配列を実装。ArrayListに似ているがいくつか違いがある。 |
| 2 | Stack - Vectorのサブクラスで標準的な後入れ先出しスタックを実装 |
| 3 | Dictionary - キー/値ストレージリポジトリを表す抽象クラス。Mapと非常に似て動作 |
| 4 | Hashtable - 元々java.utilの一部で、Dictionaryの具体的実装 |
| 5 | Properties - Hashtableのサブクラス。キーと値が両方Stringの値リストを維持 |
| 6 | BitSet - ビット値を保持する特殊なタイプの配列を作成。必要に応じてサイズを増やせる |
コレクションアルゴリズム
コレクションフレームワークは、コレクションとマップに適用できるいくつかのアルゴリズムを定義します。これらのアルゴリズムはCollectionsクラス内の静的メソッドとして定義されます。
いくつかのメソッドはClassCastExceptionをスローする可能性があります。これは互換性のない型を比較しようとしたときに発生します。またUnsupportedOperationExceptionをスローする可能性があります。これは変更不可コレクションを変更しようとしたときに発生します。
Collectionsは3つの静的変数を定義します:EMPTY_SET、EMPTY_LIST、EMPTY_MAP。すべて不変です。
| No. | アルゴリズムと説明 |
|---|---|
| 1 | コレクションアルゴリズム - すべてのアルゴリズム実装のリスト |
イテレータの使い方
コレクション内の要素を順に処理したいことがよくあります。例えば各要素を表示したい場合などです。
これを行う最も簡単な方法は、IteratorまたはListIteratorインターフェースを実装するオブジェクトであるイテレータを使用することです。
Iteratorを使用すると、コレクションを巡回し、要素を取得または削除できます。ListIteratorはIteratorを拡張し、リストの双方向走査と要素の変更を可能にします。
| No. | イテレータメソッドと説明 |
|---|---|
| 1 | Java Iteratorの使用 - IteratorとListIteratorインターフェースが提供するすべてのメソッドと例のリスト |
Comparatorの使い方
TreeSetとTreeMapは要素をソート順で格納します。しかし、ソート順の正確な意味を定義するのはコンパレータです。
このインターフェースを使用すると、所与のコレクションを任意の数の異なる方法でソートできます。また、このインターフェースは(修正できないクラスを含む)任意のクラスのインスタンスをソートするためにも使用できます。
| No. | コンパレータメソッドと説明 |
|---|---|
| 1 | Java Comparatorの使用 - Comparatorインターフェースが提供するすべてのメソッドと例のリスト |
まとめ
Javaコレクションフレームワークは、プログラマにパッケージ化されたデータ構造とそれらを操作するアルゴリズムへのアクセスを提供します。
コレクションは他のオブジェクトへの参照を保持できるオブジェクトです。コレクションインターフェースは、各タイプのコレクションで実行可能な操作を宣言します。
コレクションフレームワークのクラスとインターフェースはjava.utilパッケージにあります。
Java
- C#コレクション実践チュートリアル:実例で学ぶ柔軟なデータ管理
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Javaコレクションフレームワーク完全ガイド: インターフェース・実装クラス・アルゴリズム・イテレータ・Comparator