コレクションフレームワーク
コレクションフレームワークは、ジェネリクスを使用する代表的なライブラリの一つです。クラスライブラリの1つです。
ジェネリクスとは?
ジェネリクスとは、総称型または型引数などと呼ばれる「データ型をパラメータ化(可変のもの)する仕組み」のことです。クラスライブラリの扱う値のデータ型を事前に決めるのではなく、実際に使用する際に指定することができます。これにより、汎用的なコードを安全かつ効率的に再利用することが可能となります。
このの部分がジェネリクスです。
コレクションとは?
- 複数のオブジェクトを管理する仕組みのこと
- 配列には無い様々な便利な機能が用意されています
- 要素数の初期化が不要
- 追加、削除・挿入が容易
- 並び替えが可能
コレクションには、3つのインターフェースがあります。
- List
要素の重複が許されています。インデックスを使うことで各要素を扱うことができます。
- Set
重複要素のないオブジェクトの集まり(集合)です。Listと異なり順番を管理しません。また、インデックスもありません。
- Map
キーと値をペアで管理するコレクションです。連番ではなく、キーに意味を持たせることができます。
ArrayList
Listインターフェースを実装した代表的なクラスにArrayListがあります。
配列を使用する場合、まず要素数を決定し、それぞれの要素に値を代入します。メモリの状態は、「要素数の領域が先に確保され、その後値が追加される」形になります。
ArrayListの場合はこうなります。
はじめにArrayListの実体の領域を作ります。
ジェネリクスの部分には「ラッパークラスのみ指定可能」です。基本データ型のintなどは使用できません。
次に、値を追加していきます。
この例では、メモリの状態は配列の場合と同様の結果になりますが、要素と値が順番に追加されていきます。
for文とArrayListの組み合わせ
for文と組み合わせて使うと以下のようになります。
リストの要素数を取得するにはプロパティではなく、メソッドを使います。リストの要素を取得するには、メソッドを使います。引数には要素のインデックスにあたる、カウンタ変数を指定します。
このfor文を実行すると、このような結果になります。
HashSet
Setインターフェースを実装した代表的なクラスにHashSetがあります。
String型の値を要素として持つSet型の変数にHashSetの実体を代入しています。
メソッドで文字列を追加しています。Setは集合なので以下のような状態になります。
重複を許さないので2回追加されている”mojyamojya”は、1つしかありません。
HashMap
Mapインターフェースを実装した代表的なクラスにHashMapがあります。
Mapではインデックスの代わりにキーを使います。連番ではなく、キーに意味を持たせることができます。
ジェネリクスの書式です。
- K
- キーのデータ型
- V
- 値のデータ型
値の追加は以下のようになります。
キーと値をセットで追加します。メソッドではなく、メソッドを使います。
具体例です。
文字列のキーと文字列の値のMapを宣言して、HashMapのオブジェクトを代入しています。3つのペアをputしています。メモリの状態は、以下のようなイメージになるでしょう。
要素の値を取得する際には、メソッドを使用します。引数にはインデックスではなく、した際に指定したキーを使用します。
拡張for文(for-each文)
拡張for文とは、配列やコレクションと組み合わせて使用する繰り返しの制御文です。
for文の後ろの括弧内は(コロン)で2つの部分に分かれています。
- 要素の値を格納するための変数
配列やコレクションから1つの要素の値を取り出し、その値を格納する変数を指定します。これはfor文の中で使用されるローカル変数です。
- 配列やコレクションの変数
複数の値や状態を1つの変数に格納している、配列やコレクションを指定します。
通常のfor文と配列を組み合わせたサンプルです。
配列には4つの数値が格納されています。カウンタ変数が0〜4の処理を5回繰り返す命令文です。
i | scores[i] |
0 | 80 |
1 | 75 |
2 | 60 |
3 | 100 |
4 | 50 |
ここから、カウンタ変数iを削ぎ落とすと拡張for文になります。
(コロン)の左側、「要素の値を格納するための変数」の宣言は、の形式で指定します。ここではとしています。配列 の要素の値が数値なのでint型の変数を宣言しています。
処理の流れは以下のようになります。
- 配列やコレクションから要素を一つ取り出します。
- その要素を変数に代入します。
- ループ内の処理を実行します。
- 配列やコレクションの要素がなくなるまで、1~3を繰り返します。
変数から要素の値を1つずつ取り出して変数の中に格納しています。配列の全要素を順番に取り出して、最後の要素にたどり着くまでループを繰り返す命令文です。
繰り返し | data |
1回目 | 80 |
2回目 | 75 |
3回目 | 60 |
4回目 | 100 |
5回目 | 50 |
通常のfor文に比べ、拡張for文は簡潔に記述でき、読みやすさとパフォーマンスが向上する特徴があります。ループ内の処理でカウンタ変数が不要な場合は、拡張for文を利用しましょう。