コレクションフレームワーク概要

コレクションはデータの保存と操作のためのコアツールです。このレッスンでは、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が推奨されます。

📖 まとめ

📝 演習

  1. コレクション操作: ArrayListを作成し、10個の要素を追加し、走査して偶数を削除
  2. 重複排除: 配列から重複する要素を削除(HashSetを使用)
  3. Map練習: 文字列内の各文字の出現回数をカウント

次のレッスン

次のレッスンでは、ListとArrayListを学びます — Listの詳細な使用方法。

100%