
【Java】コレクションフレームワークとジェネリクス
Javaの学習をしていき、ある程度の基本文法について知識がつくと次はコレクションフレームワークと、ジェネリクスについて学習することになると思います。今回は、コレクションフレームワークとジェネリクスについてどういった特徴があるのか、そして使用方法についてできるだけ分かりやすく解説していきます。
1. コレクションフレームワークとジェネリクス
それではまずはコレクションフレームワークとジェネリクスの特徴を述べます。
コレクションフレームワークからです。コレクションフレームワークとは、
コレクションフレームワークは、Javaプログラミング言語でデータを効率的に管理するための一連のクラスとインタフェースの集合であり、コレクション(オブジェクトの集合)を操作するために用意されたJava標準のAPIです。下記にそれぞれのインターフェースに属する主な実装クラスをまとめます。コレクションフレームワークの実装クラスは、[実装スタイル][インターフェース名]の形式で命名されています。コレクションフレームワークは、配列よりも柔軟で効率的なデータ操作を可能にし、さまざまなアプリケーションで広く使用されています。
続いてジェネリクスの特徴です。ジェネリクスとはJavaプログラミング言語で導入された機能の一つであり、型の安全性を向上させるために使用されています。ジェネリクスを使用すると、コードをより汎用的に書くことができ、再利用性や保守性が向上します。
具体的には、ジェネリクスは、コレクションフレームワークやメソッドなどのクラスやインタフェースにパラメータを追加する仕組みを提供します。これにより、特定の型に依存せず、汎用的なコードを書くことができ、「<>」記号で囲まれたデータ型名をクラスやメソッドに付けることで、Integer型やString型などの様々な型に対応する汎用的なクラスやメソッドを作る機能のことです。
次に、コレクションとジェネリクスで使用されている機能をいくつか紹介しようと思います。
2. コレクションで使用されるクラスとインターフェース
コレクションでは以下のような要素が使用されています。
1.リスト(List)
リストは、順序付けられた要素のコレクションです。要素は順番に格納され、インデックスによってアクセスできます。
主なリスト実装クラスには、ArrayListやLinkedListがあります。
ArrayList:サイズを自動的に拡張することができる配列になります。本来、配列は定義時に指定した要素数を超えるデータを格納することはできませんが、もし配列の要素数を超えるデータを格納しようとしたときに、自動的に配列の要素数が拡張されます。これにより配列の要素数を気にすることなくデータを格納することが出来ます。
LinkedList:配列ではなく要素同士を数珠繋ぎにしたリストです。ArrayListと違い、データを末尾に追加したときは、末尾の要素と、追加した要素を繋ぎます。LinkedListも要素数の上限を気にすることなくデータを格納することが出来ます。
2.セット(Set)
セットは、一意の要素の集合です。重複する要素は許可されません。
主なセット実装クラスには、HashSetやTreeSetがあります。
HashSet:HashSetとは値が重複しても無視されます。もし、[test2, test3, test, test1]のリストがあった場合、もう一つtestをリストに追加します。するとtestが二つ重複しているので無視されてtestは一つしか出力されません。また検索で使用する際はハッシュテーブルを使用し、高速な検索が可能です。
TreeSet:二分探索木を使用し、要素が自然な順序でソートされます。簡単に言うと、Setで自然な順番で整列できるのがTreeSetです。例えば、「boboob, hoge, age, あ, か, い, さ」を追加した場合に出力すると「[age, boboob, hoge, あ, い, か, さ]」と順番が整理されて出力されます。
3.マップ(Map)
マップは、キーと値のペアのコレクションです。キーは一意であり、値には重複が許可されます。主なマップ実装クラスには、HashMapやTreeMapがあります。
HashMap:こちらも重複したものは許されないというものになっており、先ほどのHashSetと似ていますが重複した値をセットすると重複されたものが上書きされます。こちらもハッシュテーブルを使用し、高速なキーの検索が可能です。
TreeMap:こちらは、TreeSetとかなり似ており、出力の際に順番が整理されて出力されます。つまり二分探索木を使用し、キーがソートされます。
4.キュー(Queue)
キューは、FIFO(先入れ先出し)のデータ構造を表します。要素は順番に格納され、先頭からの要素の追加や削除が可能です。
主なキュー実装クラスには、ArrayDequeやPriorityQueueがあります。
ArrayDeque:両端キューとも呼ばれ、先頭末尾の双方から要素を出し入れできるキューの一種です。ArrayDequeを利用することで、キュー(FIFO:First In First Out)やスタック(LIFO:Last In First Out)といったデータ構造を表現できます。
PriorityQueue:キューを作成し値を追加して、出力する場合は自動的に順番が整理されて出力されます。つまり、「5,4,3,7,1」の順番で追加した場合出力は「1,3,4,5,7」の順番で出力されます。
3. ジェネリクスの使用方法

続いてジェネリクスの利用方法です。Javaでは、ジェネリクスは<>で囲んで利用します。もっとも多い利用例がリストになります。<〜>の中に入る型はプリミティブ型ではなくオブジェクト型になります。例えばStringはそのままですが、int型はInteger、boolean型はBoolean型になり多くは最初の文字を大文字にすることで対応可能です。下記に一例を示しています。
プリミティブ型:オブジェクト型
char:Character
byte:Byte
short:Short
int:Integer
long:Long
float:Float
double:Double
boolean:Boolean
では簡単な具体例です。下記の例を見てください。
List<String> caps = new ArrayList<>();
このとき、Listの宣言時に<〜>で囲むことで型を指定できる機能を「ジェネリクス」と呼びます。今回はString(文字列)を指定しています。また、ジェネリクスとして<〜>で囲んだ指定部分(この場合はString)を型パラメータと呼びます。ArrayListはさまざまなクラスに対応した汎用的なクラスですが、型パラメータとしてStringを指定することで、Stringに特化したクラスとして振る舞うことが可能になるのです。つまり、<String>で囲んだ場合このリストは文字列しか使用できません。もし、リストでint型などを追加しようとするとエラーが出てきます。
4. まとめ
今回は、コレクションフレームワークとジェネリクスについてまとめてみました。ネットや、参考書には中級者向けの知識として載っている場合が多いのですが、使用頻度は多めなのでぜひ覚えておきたい所です。個人的にも少し苦手な部分ですのでちゃんと知識として身につけて起きたいと思いました。