コレクションフレームワーク概要
コレクションはデータの保存と操作のためのコアツールです。このレッスンでは、Java Collection Frameworkの全体構造を学びます。
コレクションが必要な理由
配列には固定サイズの制限がありますが、コレクションは動的に成長できます。
配列 vs コレクション
| 特徴 | 配列 | コレクション |
|---|---|---|
| サイズ | 固定 | 動的 |
| 型 | プリミティブ/オブジェクト | オブジェクトのみ |
| メソッド | なし | 豊富なメソッド |
| ジェネリクス | 非サポート | サポート |
コレクションフレームワークのアーキテクチャ
TEXT
Collection(インターフェース)
├── List(インターフェース)— 順序あり、重複許可
│ ├── ArrayList(実装)
│ ├── LinkedList(実装)
│ └── Vector(実装)
├── Set(インターフェース)— 順序なし、重複不可
│ ├── HashSet(実装)
│ ├── TreeSet(実装)
│ └── LinkedHashSet(実装)
└── Queue(インターフェース)— キュー
├── LinkedList(実装)
└── PriorityQueue(実装)
Map(インターフェース)— キーと値のペア
├── HashMap(実装)
├── TreeMap(実装)
├── LinkedHashMap(実装)
└── Hashtable(実装)
Collectionインターフェース
Collectionはすべての単一値コレクションの親インターフェースです。
一般的なメソッド
| メソッド | 説明 | 戻り値の型 |
|---|---|---|
add(E e) |
要素を追加 | boolean |
remove(Object o) |
要素を削除 | boolean |
contains(Object o) |
要素を含むか | boolean |
isEmpty() |
空かどうか | boolean |
size() |
要素数 | int |
clear() |
すべてクリア | void |
toArray() |
配列に変換 | Object[] |
例:基本的な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
}
}
IterableとIterator
Iterableインターフェース
Iterableを実装したクラスはfor-eachで走査できます。
Iteratorインターフェース
Iteratorはコレクションの走査に使用されます。
| メソッド | 説明 |
|---|---|
hasNext() |
次の要素があるか |
next() |
次の要素を取得 |
remove() |
現在の要素を削除 |
例: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がスローされます。
Listインターフェース
順序付きコレクション、重複を許可。
特徴
| 特徴 | 説明 |
|---|---|
| 順序あり | 挿入順に要素を格納 |
| 重複許可 | 同じ要素を複数持てる |
| インデックスアクセス | インデックスで要素にアクセス |
一般的なメソッド
| メソッド | 説明 |
|---|---|
get(int index) |
インデックスの要素を取得 |
set(int index, E e) |
インデックスの要素を設定 |
add(int index, E e) |
指定位置に挿入 |
remove(int index) |
インデックスの要素を削除 |
indexOf(Object o) |
要素のインデックスを検索 |
subList(int from, int to) |
サブリストを取得 |
Setインターフェース
順序なしコレクション、重複不可。
特徴
| 特徴 | 説明 |
|---|---|
| 順序なし | 固定の順序がない |
| 重複不可 | 自動的に重複を排除 |
| インデックスなし | インデックスでアクセスできない |
Mapインターフェース
キーと値のペアのコレクション、キーは重複不可。
特徴
| 特徴 | 説明 |
|---|---|
| キーと値のペア | 各要素にキーと値がある |
| キーは一意 | キーは一意、値は重複可能 |
| 順序なし | HashMapは順序なし |
一般的なメソッド
| メソッド | 説明 |
|---|---|
put(K k, V v) |
キーと値のペアを追加 |
get(K k) |
キーで値を取得 |
remove(K k) |
キーと値のペアを削除 |
containsKey(K k) |
キーを含むか |
keySet() |
すべてのキー |
values() |
すべての値 |
entrySet() |
すべてのキーと値のペア |
コレクション選択ガイド
| ニーズ | 選択 |
|---|---|
| 順序あり、重複許可 | ArrayList |
| 順序なし、重複不可 | HashSet |
| 順序あり、重複不可 | LinkedHashSet |
| ソート済み、重複不可 | TreeSet |
| キーと値のペア | HashMap |
| ソート済みキーと値のペア | TreeMap |
❓ よくある質問
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練習: 文字列内の各文字の出現回数をカウント
次のレッスン
次のレッスンでは、ListとArrayListを学びます — Listの詳細な使用方法。



