Collections Framework
Collections Framework(コレクション・フレームワーク)とは、コレクションを統一的に操作および管理するための仕組みで、汎用的なインターフェースと、その実装クラスなどから構成されています。
Collections Frameworkで提供されるインターフェースのうち、Collection、List、Set、Queue、Mapの5つが基本となるインターフェースです。次の図は、Collections Frameworkに含まれる主要なインターフェースの階層構造を示しています。
Collectionインターフェース
Collectionは、コレクション操作の基本メソッドが定義されたインターフェースです。Map以外のList、Set、Queueインターフェースは、このCollectionのサブインターフェースとなっています。
次の表は、コレクションの要素に対する処理と、基本のコレクションインターフェースのメソッドとの対応をまとめたものです。
要素の主な処理 | Collection | List | Set | Queue | Map |
追加 | add | ← | ← | add offer | put |
インデックスを指定して設定 | set | ||||
検索 | contains | ← | ← | ← |
containsKey containsValue |
indexOf | |||||
取得 | get | peek | get values | ||
キーの取得 | KeySet | ||||
要素が空か判定 | isEmpty | ← | ← | ← | isEmpty |
イテレーター取得 | iterator | ← | ← | ← | |
削除 | remove | ← | ← | ← | remove |
poll | |||||
要素数 | size | ← | ← | ← | size |
配列にコピー | toArray | ← | ← | ← |
List、Set、Map、Queueインターフェース
これらのインターフェースは、それぞれオブジェクトの管理方法が異なったコレクションとなっています。
1. List(リスト)
リストは、配列のように格納される要素に順番のあるコレクションです。順番があるため、インデックスで要素を参照したり、追加したりすることができます。
2. Set(セット)
Setは、格納される要素に重複が許されないコレクションです。また、リストのような順番はなく、要素は順不同に格納されます。
3. Queue
Queue(キュー)は、窓口に人が並ぶような待ち行列を表したコレクションです。格納した要素を、古いものから順に取り出す処理に用います。
4. Map
Map(マップ)は、要素を、一意のキーと値(オブジェクト)のペアで管理するコレクションです。要素を追加するには、オブジェクトとそれに対応したキーを登録し、要素を操作するには、このキーを用います。
コレクションの実装クラス
Collections Frameworkには、これらのインターフェースを実装した、さまざなクラスが提供されています。次の表は、それぞれのインターフェースの主な実装クラスをまとめたものです。
インターフェース | 主な実装クラス | 概要・特徴 |
List | ArrayList | 可変長配列クラス |
LinkedList | リンク構造のリストクラス。ArrayListに比べて、任意の位置の追加が高速にできる | |
Vector | 可変長配列クラス | |
Set | HashSet | 任意の順序で格納する |
LinkedHashSet | 格納順序の保障がある | |
TreeSet | 要素がキーによって自動的にソートされる | |
Queue | LinkedList | リンク構造のリストクラス。上記LinkedListと同じ |
PriorityQueue | 優先順位つきキュークラス | |
ArrayDeque | 両端キュークラス | |
Map | HashMap | 基本的なMapクラス |
LinkedHashMap | 格納順序の保障がある | |
TreeMap | 要素がキーによって自動的にソートされる | |
Hashtable | キー、値ともnullは禁止 |
ArrayListクラス
ここでは、さまざな実装クラスのなかでも、もっとも基本的なArrayListクラスを見ていきましょう。名前にArrayがついているように、ArrayListクラスは、配列を拡張したような構造になっています。
ArrayListを使うには、はじめにArraListクラスをインスタンス化します。通常は、次のように引数のないコンストラクタを使います。またジェネリックスに対応していますので、同時に要素の型も指定します。
// Integerクラスを指定 ArrayList<Integer> array = new ArrayList<Integer>(); // Stringクラスを指定 ArrayList<String> array = new ArrayList<String>();
ArrayListに要素を追加するにはaddメソッド、要素をとりだすには、getメソッドを使います。getメソッドの引数は、配列と同様0から始まるインデックスです。
ArrayList<String> array = new ArrayList<String>(); array.add("ドル"); array.add("ポンド"); array.add("フラン"); String name = array.get(1); // ポンド
ArrayListクラスのその他の主なメソッドは、前述の表「インターフェースの各メソッド」のとおりです。
Iteratorインターフェース
コレクションを操作するインターフェースとして、Iterator(イテレータ、反復子)インターフェースというものが提供されています。イテレータとは、コレクションの要素を、1つずつ順番に処理するための仕組みで、さまざなコレクションに対して同じメソッドで操作することができます。なお、イテレータが使用できるクラスは、Iterableインターフェースを実装したものだけです。
ちなみに拡張for文は、Iteratorを使ったループ処理を簡略した書き方で、内部的にIteratorが使われています。