Javaのクラスであるコレクションフレームワークについて説明します。
コレクションフレームワークはJavaプログラミングをするにあたって必ずといってよいほど利用されますので必ず理解してください。
目次
コレクションフレームワークとは何か?
コレクションとは複数の要素の集まりのことです。その要素の集まりを扱う機能なのでコレクションフレームワークと言います。
コレクションフレームワークでは複数の要素(データ)を扱うための便利機能を提供します。
具体的には以下3つの種類のインターフェースから成ります。
- List
- Map
- Set
それぞれで意味や機能が異なるため、それぞれの特性を知る必要があります。
Listとは何か!?
Listとは複数の要素の順番を保持するコレクションです。
インデックスを利用して要素にアクセスするため、配列の代わりとして利用することができます。
Listのイメージ図
配列の場合、宣言時に必要な個数を指定する必要がありましたが、Listでは後から要素数を変更することが出来るのが特徴です。
実装はいくつかあるのですが、よく利用するものから説明すると以下になります。
- ArrayList
- LinkedList
Vector
※Vectorは互換性のためだけに存在し、古いソースで利用されます。ArrayListが上位互換のクラスになるため詳細は割愛します。
クラス | 任意の要素へのアクセス | 要素の途中追加、削除 |
ArrayList | 高速 | 低速 |
LindedList | 低速 | 高速 |
List宣言例
List<[要素の型]> 変数名 = new ArrayList<[要素の型]>(); List<[要素の型]> 変数名 = new LinkedList<[要素の型]>();
Listサンプルソース
import java.util.ArrayList; import java.util.List; public class ListSample { public static void main(String[] args) { List<String> list = new ArrayList<String>(); //値のセットはaddメソッドを利用 list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); //値の取得 for (int i = 0; i < list.size() -1; i++) { //値の取得はgetメソッドを利用 System.out.println(list.get(i)); } //拡張for文を利用するともっと簡単 for (String s : list) { System.out.println(s); } } }
Listサンプルソース実行結果
1
2
3
4
1
2
3
4
5
Mapとは何か!!
Mapとはキーと要素とのマッピングを表すデータ構造のインターフェースです。
インデックスではなく、キーで要素を識別して値を取得します。
Mapイメージ
実装はいくつかあるのですが、よく利用するものから説明すると以下になります。
- HashMap
- TreeMap
- LinkedHashMap
- Hashtable
※Hashtableは互換性のためだけに存在し、古いソースで利用されます。HashMapが上位互換のクラスになるため詳細は割愛します。
クラス | null可 | 順番 |
HashMap | ○ | 保障しない |
TreeMap | ○ | デフォルトは登録したキーの自然順序(昇順) |
LinkedHashMap | ○ | 登録した順番 |
Map宣言例
Map<key, [要素の型]> 変数名 = new HashMap<key, [要素の型]>(); Map<key, [要素の型]> 変数名 = new TreeMap<key, [要素の型]>(); Map<key, [要素の型]> 変数名 = new LinkedHashMap<key, [要素の型]>();
Mapサンプルソース
import java.util.HashMap; import java.util.Map; public class MapSample { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); //値のセットはputメソッドを利用 map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); map.put("key4", "value4"); map.put("key5", "value5"); //値の取得 String value = map.get("key1"); //value1が取得できる System.out.println(value); String valueNull = map.get("key6"); //存在しないkeyの場合はnull System.out.println(valueNull); //mapに該当するkeyが存在するか否かチェックすることも可能 if (map.containsKey("key1")) { System.out.println("key1は存在します"); } else { System.out.println("key1は存在しません"); } //拡張for文を利用してすべて情報を取得する for(Map.Entry<String, String> e : map.entrySet()) { System.out.println(e.getKey() + " : " + e.getValue()); } } }
Mapサンプルソース実行結果
value1
null
key1は存在します
key1 : value1
key2 : value2
key5 : value5
key3 : value3
key4 : value4
Setとは何か!!
Setとは重複要素を持たない要素の集合を表すインターフェースです。
Setイメージ
実装はいくつかあるのですが、よく利用するものから説明すると以下になります。
- HashSet
- TreeSet
- LinkedHashSet
クラス | 重複 | 順番 |
HashSet | なし | 保障しない |
TreeSet | なし | デフォルトは登録したキーの自然順序(昇順) |
LinkedHashSet | なし | 登録した順番 |
Set宣言例
Set<[要素の型]> 変数名 = new HashSet<[要素の型]>(); Set<[要素の型]> 変数名 = new TreeSet<[要素の型]>(); Set<[要素の型]> 変数名 = new LinkedHashSet<[要素の型]>();
Setサンプルソース
import java.util.HashSet; import java.util.Set; public class SetSample { public static void main(String[] args) { Set<String> set = new HashSet<String>(); //値のセットはaddメソッドを利用 set.add("value1"); set.add("value2"); set.add("value3"); set.add("value4"); set.add("value5"); set.add("value2"); //重複要素をadd //拡張For文を利用 for (String s : set) { System.out.println(s); } } }
Setサンプルソース実行結果
value5
value2
value1
value4
value3
重複を排除したい場合に一旦Setにデータを入れて、すべて取り出すといった使い方をすることが多いです。
終わりに
今回はコレクションフレームワークの内、利用頻度の高い実装クラスを紹介しました。
8割、9割は今回紹介したクラスで問題ないと思われますが、必要に応じてその他実装クラスを利用してみてください。
また、特に説明もせず利用してましたが実はクラスとインターフェース(オブジェクト指向)を理解すると、以下のサンプルプログラムも納得してもらえると思います。
//この書き方でもOKだけど、、、 ArrayList<[要素の型]> 変数名 = new ArrayList<[要素の型]>(); //実際はこのように記述されることが多い List<[要素の型]> 変数名 = new ArrayList<[要素の型]>();
さらに、宣言時に利用する要素の型を明示的に記入しましたが、下記のようにも記述することが出来ます。
//この書き方でもOKだけど、、、 List 変数名 = new ArrayList(); //実際はこのように記述されることが多い List<[要素の型]> 変数名 = new ArrayList<[要素の型]>();
特に古いソース(JDK1.5以前に書かれたソース)ではこの記述がされていると思います。
これはジェネリクスといってJDK1.5からさポートされるようになった機能です。
Javaは変数の型を厳格にチェックする言語ですが、ジェネリクスが無い時代はListにいろいろな型のデータを詰め込むことが可能でした(あまりそのような使い方はしないことがおおいですが。。。)
型をあらかじめ決めることができるのでジェネリクスで記述した場合、拡張For文を利用することもできるようになり値の取出しが楽になりました。
コメント
[…] コレクションフレームワークについては、以下のサイトを参照のこと。 https://ittoybox.com/archives/206 […]