Javaコレクションフレームワーク入門:ListとSetの基本

Javaのコレクションフレームワークは、主に以下の2つの大分類に分けられる。

  • Collection:List、Set、Queueが含まれる。
  • Map:キーと値のペアを管理するインターフェース。

Listインターフェース

Listは順序付きで重複を許容するコレクションであり、インデックスによる要素アクセスが可能である。

ArrayList

ArrayListは内部的に動的配列を用いて実装されており、ランダムアクセスに優れている。末尾への追加・削除は高速だが、中間位置での操作は要素のシフトが必要なため低速となる。容量が不足すると自動的に拡張されるが、大量データ処理時にはパフォーマンスに注意が必要である。

// ArrayListの基本操作
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("cherry");

// インデックスによるアクセス
for (int i = 0; i < fruits.size(); i++) {
    System.out.println(fruits.get(i));
}

// 拡張for文による走査
for (String fruit : fruits) {
    System.out.println(fruit);
}

// 要素の削除(インデックス1)
fruits.remove(1);

// 要素の更新
fruits.set(1, "blueberry");

LinkedList

LinkedListは双方向連結リストで実装されており、ランダムアクセスには非効率だが、任意位置での挿入・削除が高速である。各ノードが前後の参照を持つため、メモリ使用量はArrayListより多い。

// LinkedListの基本操作
Deque<String> items = new LinkedList<>();
items.add("pen");
items.add("notebook");
items.add("eraser");

// 走査(拡張for文)
for (String item : items) {
    System.out.println(item);
}

// 中間要素の削除
items.remove(1);

// 要素の更新
items.set(1, "highlighter");

VectorとStack

VectorはArrayListと類似するが、すべてのメソッドがsynchronizedで同期されているためスレッドセーフだが低速である。現在では非推奨とされ、通常はArrayListが使われる。

StackはVectorのサブクラスでLIFO(後入れ先出し)構造を提供するが、これも同期のオーバーヘッドがあるため、現代ではArrayDequeが推奨される。

Setインターフェース

Setは重複を許さず、順序保証がない(実装により異なる)コレクションである。インデックスによるアクセスは不可。

HashSet

HashSetは内部でHashMapを使用し、キーのみを格納する。要素の重複排除に適しており、ハッシュテーブルに基づくため検索・追加・削除が高速。

Set<String> uniqueWords = new HashSet<>();
uniqueWords.add("hello");
uniqueWords.add("world");
uniqueWords.add("hello"); // 重複は無視

System.out.println(uniqueWords.size()); // 出力: 2
System.out.println(uniqueWords.contains("world")); // true

// 更新は削除+追加で行う
uniqueWords.remove("hello");
uniqueWords.add("hi");

LinkedHashSet

LinkedHashSetはHashSetを継承し、内部でLinkedHashMapを使用する。挿入順序を維持しつつ、HashSetの高速性を保つ。

Set<String> orderedSet = new LinkedHashSet<>();
orderedSet.add("first");
orderedSet.add("second");
orderedSet.add("third");

orderedSet.remove("second");
orderedSet.add("modified");

// 挿入順に走査される
for (String s : orderedSet) {
    System.out.println(s); // first → third → modified
}

TreeSet

TreeSetは赤黒木(Red-Black Tree)に基づくSortedSetの実装で、要素を自然順序またはComparatorで自動ソートする。nullの挿入はNullPointerExceptionを引き起こす。

Set<String> sortedNames = new TreeSet<>();
sortedNames.add("Charlie");
sortedNames.add("Alice");
sortedNames.add("Bob");

System.out.println(sortedNames); // [Alice, Bob, Charlie]

sortedNames.remove("Bob");
sortedNames.add("David");

System.out.println(sortedNames.contains("Alice")); // true

Setの実装は多くがMapを内部で利用している。これはMapのキーが「一意かつ無順序」という特性を活かして、Setの要件(重複禁止)を効率的に満たすためである。

タグ: Java arraylist LinkedList hashset LinkedHashSet

5月16日 07:00 投稿