【JavaGold勉強記#15】コレクション編

JavaGold資格取得に向けた勉強記第15回は「コレクション」についてです。

ここではJavaGold資格取得に向けて勉強している駆け出しプログラマーの私がアウトプットの意味も込めて、「コレクション」について紹介させていただきます。

JavaGold資格取得に向けて勉強されている方や、プログラマー初心者の方にとって参考になれば幸いです!

コレクションとは

コレクションは、複数の要素を一つのまとまりとして管理するためのデータ構造です。

Javaのコレクションフレームワークは、これらのデータ構造を操作するための共通のAPIを提供し、柔軟で効率的なコーディングを可能にします。

主要なコレクションインタフェース

List

順序を保持するコレクションであり、同じ要素を複数回含むことができます。Listでは、要素に番号を振って、順番を管理します。

Listインタフェースの実現クラスには、主に次のようなクラスがあります。

ArrayList

可変サイズの動的配列を表現するクラスです。要素の追加や削除がリストの末尾で行われる場合に高速な性能を発揮します。ただし、途中への要素の挿入や削除はリスト全体をシフトする必要があり、それに伴って性能が低下する可能性があります。

List<String> arrayList = new ArrayList<>();

LinkedList

双方向リンクリストを表現するクラスです。要素の追加や削除が高速であり、特に途中への挿入や削除が優れています。ただし、ランダムアクセスが遅く、要素へのアクセスには先頭から順番に辿る必要があります。

List<String> linkedList = new LinkedList<>();

Vector

スレッドセーフで同期された実装クラスです。しかし、そのために性能が低下する可能性があり、通常はArrayListが推奨されます。Vectorは古い実装であり、新しいコードでの使用は非推奨となっています。

List<String> vector = new Vector<>();

Listインタフェースの実現クラスの特徴は以下のように覚えておきましょう。

ArrayListは、読み込みは早いが、書き込みが遅い
LinkedListは、書き込みは早いが、読み込みは遅い
Vectorは、マルチスレッドに対応しているが、パフォーマンスは悪い

Set

順序を保証しないコレクションであり、重複する要素を持たない特徴があります。

主な実装クラスにはHashSetやTreeSetがあります。HashSetは、要素の並び順を保証しない分、高速に処理することができます。TreeSetは、自然順序で並べるか、引数で渡されたComparatorのアルゴリズムに従います。そのため、HashSetに比べるとパフォーマンスは劣ります。

Map

キーと値のペアを管理するコレクションです。キーは一意であり、値は重複しても構いません。主な実装クラスにはHashMapやTreeMapがあります。

Map.Entry

Mapインタフェース内に定義されたインナーインタフェースです。Mapはキーと値のペアを格納し、Map.Entryはそのキーと値のペアを表現するためのインターフェースです。

以下は、Map.Entry インターフェースの主なメソッドです:

  1. getKey(): エントリのキーを返します。
  2. getValue(): エントリの値を返します。
  3. setValue(V value): エントリの値を指定した値に設定します。

Map.Entryを使用することで、Mapからエントリ(項目)を取得し、それに対してキーと値を個別に取得・設定できます。次のコードはMap.Entryを使用した例です。

import java.util.HashMap;
import java.util.Map;

public class MapEntryExample {
    public static void main(String[] args) {
        // HashMapを作成
        Map<String, Integer> map = new HashMap<>();
        map.put("One", 1);
        map.put("Two", 2);
        map.put("Three", 3);

        // Mapのエントリセットを取得し、イテレート
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());

            // 値を変更する例
            if (entry.getKey().equals("Two")) {
                entry.setValue(20);
            }
        }

        // 値が変更されたか確認
        System.out.println("Updated Value for 'Two': " + map.get("Two")); // Output: 20
    }
}

この例では、Map.Entryを使ってHashMapのエントリセットをイテレートし、各エントリのキーと値を表示しています。また、特定の条件に基づいて値を変更しています。Map.Entryは、Mapを効果的に扱うための重要な手段の一つです。

Queue

要素を順番に格納し、最初に追加された要素が最初に取り出されるデータ構造です。主な実装クラスにはLinkedListがあります。

Deque

末尾と先頭の両方から入れて、両方から取り出せるコレクションです。Dequeとは、「Double-ended queue」(両端キュー)の略です。

最後に

今回は、コレクションとそのインタフェースをまとめてみました。

Javaのコレクションフレームワークは、異なるデータ構造を効果的に操作するための堅牢な手段を提供します。適切な実装クラスの選択と操作方法の理解は、効率的でメンテナンス可能なコードの作成に不可欠です。コレクションはJavaプログラミングの基本的な要素であり、開発者はこれらを十分に理解して活用することが求められるので、この機会に覚えてみてください。