Java開発の登竜門コレクションフレームワークを正しく理解していますか?コレクションフレームワークというと難しく聞こえるかもしれませんが、ListとMapという記述を見かけたことがあるかもしれませんが、それらを総称した言い方です。
本記事では、ListとMapを中心に、実務で即戦力となる知識を網羅的に解説します。初心者から中級者まで、全てのJavaエンジニア必見の内容です。
関連 Javaの1stステップ:基本的な構文ルールを復習する
コレクションフレームワークとは
Javaのコレクションフレームワークは、データの集まりを効率的に扱うための仕組みです。主な利点は以下の通りです。
特に、ListとMapはよく使われるコレクションで、その理解はJavaプログラミングの基礎となります。
Listの基礎
Listは、順番があるデータの集まりを扱うコレクションです。同じ値を持つ要素を複数含めることができます。代表的な実装クラスには、ArrayListとLinkedListがあります。
ArrayListの使い方と特徴
ArrayListは、可変長の配列として機能します。
特徴
- データの読み取りが高速(get()メソッド)
- 末尾への要素追加が高速
- 中間の要素の追加・削除は遅い
基本的な使い方
// インポートが必要です import java.util.ArrayList; import java.util.List; List list = new ArrayList<>(); list.add("Java"); list.add("Python"); list.add("C++"); // 要素の取得 String language = list.get(0); // "Java" // 要素の削除 list.remove(1); // "Python"を削除
LinkedListの使い方と特徴
LinkedListは、データの繋がりを持つリストです。
特徴
- データの追加・削除が高速
- データの読み取りは遅い
基本的な使い方
// インポートが必要です import java.util.LinkedList; import java.util.List; List list = new LinkedList<>(); list.add("Spring"); list.add("Summer"); list.add("Fall"); // 先頭に要素を追加 list.add(0, "Winter"); // 末尾の要素を削除 list.remove(list.size() - 1); // "Fall"を削除
Listの選び方
使い方に応じて適切なListを選ぶことが重要です。
要件 | おすすめのクラス |
---|---|
データの読み取りが多い | ArrayList |
データの追加・削除が多い | LinkedList |
Mapの基礎
Mapは、キーと値の組み合わせでデータを管理するコレクションです。代表的な実装クラスには、HashMap、LinkedHashMap、TreeMapがあります。
HashMapの使い方と特徴
HashMapは、キーをもとにデータを素早く探せる仕組みです。
特徴
基本的な使い方
// インポートが必要です import java.util.HashMap; import java.util.Map; Map map = new HashMap<>(); map.put("Apple", 100); map.put("Banana", 80); map.put("Orange", 90); // 値の取得 int price = map.get("Banana"); // 80 // エントリーの削除 map.remove("Apple");
LinkedHashMapの使い方と特徴
LinkedHashMapは、データの順番を保持するMapです。
特徴
- データの順番(追加順やアクセス順)を保持
- HashMapよりもメモリを多く使う
基本的な使い方
// インポートが必要です import java.util.LinkedHashMap; import java.util.Map; Map map = new LinkedHashMap<>(); map.put("First", 1); map.put("Second", 2); map.put("Third", 3); // 順番を保持してキーを取得 for (String key : map.keySet()) { System.out.println(key); }
TreeMapの使い方と特徴
TreeMapは、キーを自動的にソートして管理するMapです。
特徴
- キーが自動的に順番(自然順序)に並ぶ
- 操作の速度は遅め
null
キーは許可されない
基本的な使い方
// インポートが必要です import java.util.Map; import java.util.TreeMap; Map map = new TreeMap<>(); map.put("C", 3); map.put("A", 1); map.put("B", 2); // ソートされた順序でキーを取得 for (String key : map.keySet()) { System.out.println(key); }
Mapの選び方
目的に応じて適切なMapを選びましょう。
要件 | おすすめのクラス |
---|---|
高速なデータ操作、順番は不要 | HashMap |
データの順番を保持したい | LinkedHashMap |
キーをソートしたい | TreeMap |
コレクションを使う上でのポイント
インターフェース型で宣言する
変数は実装クラスではなく、インターフェース型で宣言しましょう。
// 良い例 List list = new ArrayList<>(); // 良くない例 ArrayList list = new ArrayList<>();
ジェネリクスを使って型安全に
ジェネリクスを使うことで、型の安全性を高められます。
List list = new ArrayList<>(); list.add("Sample"); // エラーになる // list.add(123);
イミュータブルなコレクションを使う
変更しないコレクションは、イミュータブル(不変)にすると安全です。
List unmodifiableList = Collections.unmodifiableList(list);
適切なコレクションを選ぶ
データの特徴や目的に合わせて、最適なコレクションを選びましょう。
- 重複を許さない:
Set
- 順番が大事:
List
- キーと値で管理:
Map
パフォーマンス向上のコツ
初期容量を設定する
大量のデータを扱う場合、初期容量を設定すると効率が良くなります。
List list = new ArrayList<>(1000); Map map = new HashMap<>(1000);
不要なデータを削除する
使わなくなったデータは明示的に削除し、メモリを節約しましょう。
list.clear(); map.clear();
スレッドセーフなコレクションを使う
マルチスレッド環境では、ConcurrentHashMap
などを使って安全性を確保します。