Collections Framework は、オブジェクトのグループを格納および操作するためのJavaの統一されたインターフェースとクラスのセットです — List、Set、Map、Queue とそれらの実装です。既成で十分にテストされたデータ構造を提供するため、自分で構築することはほぼありません。
Collection
├── List — ordered, allows duplicates, indexed access
├── Set — no duplicates, models uniqueness
└── Queue — FIFO/priority ordering for processing
Map (separate hierarchy) — key→value pairs
List<String> list = new ArrayList<>(); // backed by an array — fast random access
list.add("a");
list.get(0); // index access — O(1)
list.contains("a"); // O(n) search
// LinkedList — fast insert/remove at ends, O(n) random access
ArrayList(配列ベース、高速インデックス)がデフォルトです。LinkedList は末尾への頻繁な挿入に適しています。
Set<String> set = new HashSet<>(); // O(1) add/contains, NO order
set.add("a");
set.add("a"); // ignored — duplicates not allowed
set.contains("a"); // O(1) — great for membership tests
// TreeSet — sorted order; LinkedHashSet — insertion order
HashSet は O(1) の一意性チェックを提供します。TreeSet は要素をソート状態に保ちます。
Map<String, Integer> map = new HashMap<>(); // O(1) get/put, no order
map.put("age", 30);
map.get("age"); // 30
map.getOrDefault("x", 0); // safe access with default
map.computeIfAbsent("list", k -> new ArrayList<>()); // handy for grouping
// TreeMap — sorted by key; LinkedHashMap — insertion order
HashMap は O(1) のキーベースルックアップの主力です。
Need ordered + indexed + duplicates → ArrayList
Need uniqueness, fast lookup → HashSet
Need key→value, fast lookup → HashMap
Need sorted order → TreeSet / TreeMap
Need FIFO processing → ArrayDeque / LinkedList (Queue)
Need thread-safety → ConcurrentHashMap, etc.
ArrayList: get O(1), add-end O(1), contains/remove O(n)
HashMap/HashSet: get/put/contains O(1) average
TreeMap/TreeSet: O(log n) (sorted)
LinkedList: add/remove-ends O(1), get O(n)
Collections Framework は Java の最もよく使われる部分の1つです — ほぼすべてのプログラムは、これを使用してデータのグループを格納および処理します。
正しいコレクションを選択することは、正確性とパフォーマンスに直接影響する重要なスキルです:順序付きインデックスデータには ArrayList、一意性には HashSet、高速キールックアップには HashMap、必要に応じてソート済み/並行バリアントを使用します。
インターフェース(List/Set/Map/Queue)、その実装、特に パフォーマンス特性(HashMap の O(1) ルックアップ対リスト検索の O(n))を理解することで、適切な構造を選択でき、誤った構造を使用する(遅いコードの一般的な原因)ことを避けられます。
これは Java での日々の開発のための基礎的で実践的な知識です。