Java: コレクションフレームワーク概要
コレクションはデータの保存と操作のためのコアツールです。このレッスンでは、Java Collection Frameworkの全体構造を学びます。
1. コレクションが必要な理由
配列には固定サイズの制限がありますが、コレクションは動的に成長できます。
(1) 配列 vs コレクション
| 特徴 | 配列 | コレクション |
|---|---|---|
| サイズ | 固定 | 動的 |
| 型 | プリミティブ/オブジェクト | オブジェクトのみ |
| メソッド | なし | 豊富なメソッド |
| ジェネリクス | 非サポート | サポート |
2. コレクションフレームワークのアーキテクチャ
TEXT
📖 参照専用
Collection(インターフェース)
├── List(インターフェース)— 順序あり、重複許可
│ ├── ArrayList(実装)
│ ├── LinkedList(実装)
│ └── Vector(実装)
├── Set(インターフェース)— 順序なし、重複不可
│ ├── HashSet(実装)
│ ├── TreeSet(実装)
│ └── LinkedHashSet(実装)
└── Queue(インターフェース)— キュー
├── LinkedList(実装)
└── PriorityQueue(実装)
Map(インターフェース)— キーと値のペア
├── HashMap(実装)
├── TreeMap(実装)
├── LinkedHashMap(実装)
└── Hashtable(実装)
3. Collectionインターフェース
Collectionはすべての単一値コレクションの親インターフェースです。
(1) 一般的なメソッド
| メソッド | 説明 | 戻り値の型 |
|---|---|---|
add(E e) |
要素を追加 | boolean |
remove(Object o) |
要素を削除 | boolean |
contains(Object o) |
要素を含むか | boolean |
isEmpty() |
空かどうか | boolean |
size() |
要素数 | int |
clear() |
すべてクリア | void |
toArray() |
配列に変換 | Object[] |
(2) サンプル:基本的なCollection操作
JAVA
import java.util.ArrayList;
import java.util.Collection;
public class CollectionDemo {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
// 要素を追加
collection.add("Alice");
collection.add("Bob");
collection.add("Charlie");
System.out.println("Collection: " + collection); // [Alice, Bob, Charlie]
// チェック
System.out.println("Aliceを含む: " + collection.contains("Alice")); // true
System.out.println("サイズ: " + collection.size()); // 3
System.out.println("空か: " + collection.isEmpty()); // false
// 削除
collection.remove("Bob");
System.out.println("削除後: " + collection); // [Alice, Charlie]
// 配列に変換
Object[] array = collection.toArray();
for (Object obj : array) {
System.out.println(obj);
}
// クリア
collection.clear();
System.out.println("クリア後のサイズ: " + collection.size()); // 0
}
}
4. IterableとIterator
(1) Iterableインターフェース
Iterableを実装したクラスはfor-eachで走査できます。
(2) Iteratorインターフェース
Iteratorはコレクションの走査に使用されます。
| メソッド | 説明 |
|---|---|
hasNext() |
次の要素があるか |
next() |
次の要素を取得 |
remove() |
現在の要素を削除 |
(3) サンプル:Iteratorの使用
JAVA
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 方法1:for-each
for (String name : names) {
System.out.println(name);
}
// 方法2:Iterator
Iterator<String> it = names.iterator();
while (it.hasNext()) {
String name = it.next();
System.out.println(name);
}
// 方法3:Iteratorで削除
Iterator<String> it2 = names.iterator();
while (it2.hasNext()) {
String name = it2.next();
if (name.startsWith("B")) {
it2.remove(); // 安全な削除
}
}
System.out.println("削除後: " + names); // [Alice, Charlie]
}
}
⚠️ 注意: 走査中に要素を削除する場合は、コレクションのremoveメソッドではなく、Iteratorのremoveメソッドを使用してください。otherwise ConcurrentModificationExceptionがスローされます。
5. Listインターフェース
順序付きコレクション、重複を許可。
(1) 特徴
| 特徴 | 説明 |
|---|---|
| 順序あり | 挿入順に要素を格納 |
| 重複許可 | 同じ要素を複数持てる |
| インデックスアクセス | インデックスで要素にアクセス |
(2) 一般的なメソッド
| メソッド | 説明 |
|---|---|
get(int index) |
インデックスの要素を取得 |
set(int index, E e) |
インデックスの要素を設定 |
add(int index, E e) |
指定位置に挿入 |
remove(int index) |
インデックスの要素を削除 |
indexOf(Object o) |
要素のインデックスを検索 |
subList(int from, int to) |
サブリストを取得 |
6. Setインターフェース
順序なしコレクション、重複不可。
(1) 特徴
| 特徴 | 説明 |
|---|---|
| 順序なし | 固定の順序がない |
| 重複不可 | 自動的に重複を排除 |
| インデックスなし | インデックスでアクセスできない |
7. Mapインターフェース
キーと値のペアのコレクション、キーは重複不可。
(1) 特徴
| 特徴 | 説明 |
|---|---|
| キーと値のペア | 各要素にキーと値がある |
| キーは一意 | キーは一意、値は重複可能 |
| 順序なし | HashMapは順序なし |
(2) 一般的なメソッド
| メソッド | 説明 |
|---|---|
put(K k, V v) |
キーと値のペアを追加 |
get(K k) |
キーで値を取得 |
remove(K k) |
キーと値のペアを削除 |
containsKey(K k) |
キーを含むか |
keySet() |
すべてのキー |
values() |
すべての値 |
entrySet() |
すべてのキーと値のペア |
8. コレクション選択ガイド
| ニーズ | 選択 |
|---|---|
| 順序あり、重複許可 | ArrayList |
| 順序なし、重複不可 | HashSet |
| 順序あり、重複不可 | LinkedHashSet |
| ソート済み、重複不可 | TreeSet |
| キーと値のペア | HashMap |
| ソート済みキーと値のペア | TreeMap |
▶ サンプル
JAVA
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
System.out.println(list); // [Java, Python]
❓ よくある質問
Q ArrayListとLinkedListのどちらを選ぶべきですか?
A 頻繁なクエリにはArrayListを使用し、頻繁な追加/削除にはLinkedListを使用します。通常はArrayListが推奨されます。
Q HashSetの重複排除はどのように機能しますか?
A まずhashCodeを比較し、次にequalsを比較します。両方が一致した場合に重複と見なされます。
Q HashMapとHashtableの違いは何ですか?
A HashMapはスレッドセーフではありませんが高速です。Hashtableはスレッドセーフですが低速です。HashMapが推奨されます。
📖 まとめ
- コレクションフレームワークにはCollectionとMapの2つの主要な階層がある
- Listは順序ありで重複許可、Setは順序なしで重複不可、Mapはキーと値のペア
- Iteratorはコレクションの走査に使用
- ニーズに基づいて適切なコレクションタイプを選択
📝 練習問題
- コレクション操作: ArrayListを作成し、10個の要素を追加し、走査して偶数を削除
- 重複排除: 配列から重複する要素を削除(HashSetを使用)
- Map練習: 文字列内の各文字の出現回数をカウント
9. 次のレッスン
次のレッスンでは、ListとArrayListを学びます — Listの詳細な使用方法。