第14章 コレクションとジェネリックス (Java)
- コレクションとは
- コレクションは複数のオブジェクトを格納して出し入れするという点では、配列と同じであるが、配列寄りのはるかに強力な機能を持つ。
オブジェクトについて、コレクションを使うことがぼとんどで、配列をしょうするのはかなり限定されたケースになる。- List
先頭の要素から最後の要素までが直線的に連結している構造 - Set
同じものは含まないという構造。要素間のつながりはない - Map
要素がそれぞれのキーを持ち、キーの値で検索できる。
要素間のつながりはない。 - Queue
「先入れ後だし」「先入れ先出し」などの一定の順序で出し入れできる。
- List
- コレクションと便利に使用するためのユーティリティ
- Collection
主にListをソートしたり検索したりする。 - Arrays
基本データ型を含む配列型についてソートと検索を行う
- Collection
- コレクションは複数のオブジェクトを格納して出し入れするという点では、配列と同じであるが、配列寄りのはるかに強力な機能を持つ。
- インターフェース・クラス構成図
- これらのクラスが要素として格納するのはオブジェクトの参照であり、オブジェクトそのものはヒープ領域から移動することはできないので、これくしょんでは、その参照を要素に格納してオブジェクトを操作する。
- List系
これらのクラスはインタフェースとしてListを実装する。
配列のようにインデックス番号で要素にアクセスする。
サイズは要素が増えるにしたがって自動的に拡大されるため、格納する要素数をあらかじめ指定する必要はない。- ArrayList
List系の代表格で、もっともよく利用されるクラス。 - LinkedList
挿入や削除を高速に処理できるリスト構造に加えて、キュー構造やスタック構造の基本機能をもつ双方リスト
- ArrayList
- Set系
これらのクラスはインタフェースとしてSetを実装する。
同じ値の要素を重複して格納することはできない。
サイズは要素が増えるにしたがって自動的に拡大されるため、格納する要素数をあらかじめ指定する必要はない。- HashSet
Set系の代表格。
要素は相互に連結していないので順序はない。したがって何らか特定の順序で取り出せない。 - LinkedHashSet
用紙は相互に連結して、挿入順に順序がつくSet。 - TreeSet
辞書順や数の大小など要素が自然順序で順序づけられるSet
- HashSet
- Map系
これらのクラスはインターフェースとしてMapを実装する。
キーと値をセットにして格納する。
高速に検索できるようキー部はハッシュ関数で位置を示す特殊な値に変換される。
したがって、後からキーを指定して要素を高速に取り出すことが可能- HashMap
Map系の代表格で、良く利用されるクラス - LinkedHashMap
挿入した順序を保持しているMap。
キーの全部を取り出してm先頭から処理する場合も挿入順にキーを取り出すことができる。 - TreeMap
キーの自然順序づけが行われる。
そのため「あるキーより多きもので最小のキーをもつ要素」のような検索が可能。 - Hashtable
HashMapと同じであるが、マルチスレッド環境で安全に使用できる。
ただし、HashMapより効率が劣る。
- HashMap
- Queue系
インターフェースとして、Queueを実装するクラス。
最初に入力したデータが最初に出力されるものをキューという。
最後に入力したデータが最初に出力されるものをスタックという。
順番待ちの処理などに使用される。- LinkedList
Qurue系の代表格。 - PriorityQurue
自然順序または特に定義した順序により、優先度の高いものを策に出力するキュー。
- LinkedList
- ジェネリックス
- ジェネリックスとは、クラスやインタフェース、メソッドなどの「型」をパラメータ化することを可能にする機能。
—————————————————————————————————————
ジェネリックスの記述方法
- ジェネリックスを使用した変数の宣言
- コレクション型 < データ型 > 変数名;
- ジェネリックスを使用した変数の宣言(パラメータが2つの場合)
- コレクション型 < データ型1,データ型2 > 変数名;
—————————————————————————————————————-
- ジェネリックスを使用して宣言したコレクション(オブジェクト)を生成する場合は、コンストラクタにも 型パラメータの宣言と記述が必要。
- 型パラメータは原則として右辺、左辺で同じデータ型を指定しないとコンパイルエラーになります。 型変換が可能でもサブクラスの型を記述することは、できない。
————————————————————————————————————–
ジェネリックスを利用して宣言したコレクションの生成 []は省略可能
コレクション型 < データ型 > 変数名 = new コレクション型 < データ型 >(引数1[,引数2…])
————————————————————————————————————-
- ジェネリックスを利用するとJDK1.4以前ではできなかった、格納されたオブジェクトの型をコンパイル時に チェックすることができ、要素を取り出す際にもキャストする必要もないため、安全にコレクションを利用することが できる。これをタイプセーフという。
- ジェネリックスがコンパイル時にのみ型チェックを行うのに対し、配列を利用すると型が明確になっているため コンパイル時と実行時の両方で型チェックを行うことができ、よりタイプセーフといえる