Java アドバンス

Java データ構造

1. Java データ構造

データ構造とは、データを効率的に利用できるように保存・整理するための手法です。

配列(Array)はデータ構造の一種であり、単一の変数に複数の要素を格納することができます。Javaでは、java.utilパッケージの中に他にも多くのデータ構造が用意されており、それぞれ異なるデータ操作に適しています。

代表的なものとして、以下が挙げられます:

  • ArrayList
  • HashSet
  • HashMap

ヒント: データ構造は「高機能な配列」のようなものです。配列よりも柔軟性が高く、豊富な機能を備えています。

これらについて詳しく掘り下げる前に、まずはそれぞれの概要について簡単に紹介します。

2. ArrayList

ArrayListは、必要に応じてサイズを変更できる「可変長配列」です。
要素を格納し、インデックス(添字)を使用してアクセスすることができます。

2.1 実装コード例

// ArrayListクラスをインポート
import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    ArrayList<String> cars = new ArrayList<String>();
    cars.add("Volvo");
    cars.add("BMW");
    cars.add("Ford");
    cars.add("Mazda");
    System.out.println(cars);
  }
}

3. HashSet

HashSetは、すべての要素がユニーク(一意)であるコレクションです。重複した要素を格納することはできません。

3.1 実装コード例

// HashSetクラスをインポート
import java.util.HashSet;

public class Main {
  public static void main(String[] args) {
    HashSet<String> cars = new HashSet<String>();
    cars.add("Volvo");
    cars.add("BMW");
    cars.add("Ford");
    cars.add("BMW");  // 重複データ
    cars.add("Mazda");
    System.out.println(cars);
  }
}

注意: 上記の例では "BMW" を2回追加していますが、セット内のすべての要素は一意でなければならないため、出力結果には1回しか表示されません。

4. HashMap

HashMapは、キーと値のペア(key-value pairs)でデータを保存します。名前やIDなどの「キー」を使って特定の値を素早く検索したい場合に非常に便利です。

4.1 実装コード例

// HashMapクラスをインポート
import java.util.HashMap;

public class Main {
  public static void main(String[] args) {
    // capitalCitiesという名前のHashMapオブジェクトを作成
    HashMap<String, String> capitalCities = new HashMap<String, String>();

    // キーと値(国, 都市)を追加
    capitalCities.put("England", "London");
    capitalCities.put("Germany", "Berlin");
    capitalCities.put("Norway", "Oslo");
    capitalCities.put("USA", "Washington DC");
    System.out.println(capitalCities);
  }
}

5. データ構造の概要比較

データ構造保存内容順序の保持重複の許可最適な用途
ArrayList順序付けられた要素ありありインデックスによる要素へのアクセス
HashSetユニークな要素なしなし重複の回避、高速な存在チェック
HashMapキーと値のペアなしあり(※キーは一意)キーによる高速なデータ検索

6. イテレータ (Iterators)

データ構造を学習する際、よく耳にするのがイテレータ(Iterator)です。
イテレータは、データ構造内の要素を順番にループ処理するための仕組みです。英語の「Iterating」は技術用語で「反復処理(ループ処理)」を意味するため、このように呼ばれます。

6.1 ArrayListでイテレータを使用する例

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  public static void main(String[] args) {
    // String型のArrayListを作成
    ArrayList<String> cars = new ArrayList<String>();
    cars.add("Volvo");
    cars.add("BMW");
    cars.add("Ford");
    cars.add("Mazda");

    // ArrayListのイテレータを取得
    Iterator<String> it = cars.iterator();

    // hasNext()とnext()を使用してリストを反復処理
    while(it.hasNext()) {
      System.out.println(it.next());
    }
  }
}