Java アドバンス

Java ArrayList

1. Java ArrayList

ArrayListは、サイズ変更が可能な「動的配列」です。
java.utilパッケージに含まれており、Listインターフェースを実装しています。

Javaの標準的な配列(Array)との最大の違いは、標準の配列はサイズが固定されている点です(配列に要素を追加したり削除したりするには、新しい配列を作成する必要があります)。一方で、ArrayListはいつでも自由に要素を追加・削除することができます。

2. ArrayListの作成

ArrayListを使用するには、まずjava.utilからインポートする必要があります。

2.1 実装コード例

文字列を格納する cars という名前の ArrayList オブジェクトを作成します。

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

ArrayList<String> cars = new ArrayList<String>(); // ArrayListオブジェクトを作成

これで、add()get()set()remove() などのメソッドを使ってリストを操作できるようになります。

3. 要素の追加

ArrayListに要素を追加するには、add() メソッドを使用します。

3.1 末尾への追加

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.2 インデックスを指定した挿入

インデックス番号を指定することで、特定の位置に要素を追加することも可能です。

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(0, "Mazda"); // リストの先頭(インデックス 0)に要素を挿入

    System.out.println(cars);
  }
}

ArrayListは要素を追加した順序を保持します。最初に追加したアイテムのインデックスは 0、次は 1、という具合になります。

4. 要素へのアクセス

ArrayList内の要素にアクセスするには、get() メソッドを使用し、インデックス番号を指定します。

4.1 実装コード例

cars.get(0);  // 最初の要素を取得

5. 要素の変更

要素を修正したい場合は、set() メソッドを使用し、インデックス番号を指定します。

5.1 実装コード例

cars.set(0, "Opel"); // 0番目の要素を"Opel"に書き換え

6. 要素の削除

要素を削除するには、remove() メソッドでインデックス番号を指定します。

6.1 特定の要素の削除

cars.remove(0); // 0番目の要素を削除

6.2 すべての要素の削除

ArrayList内のすべての要素を削除するには、clear() メソッドを使用します。

cars.clear();

7. ArrayListのサイズ

ArrayListにいくつの要素が含まれているかを確認するには、size() メソッドを使用します。

7.1 実装コード例

cars.size();

8. ArrayListのループ処理

for ループを使用して ArrayList の要素をループ処理できます。ループの回数を指定するために size() メソッドを併用します。

8.1 通常のforループ

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");
    for (int i = 0; i < cars.size(); i++) {
      System.out.println(cars.get(i));
    }
  }
}

8.2 拡張for文(for-each)

また、拡張for文(for-each loop) を使うとよりシンプルに記述できます。

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");
    for (String i : cars) {
      System.out.println(i);
    }
  }
}

9. その他の型(ラッパークラス)

ArrayList の要素は実際には「オブジェクト」です。上記の例では、"String" 型のオブジェクトを作成しました。Javaにおいて String はオブジェクト(プリミティブ型ではない)であることを思い出してください。

int のような他の型を使用する場合は、対応するラッパークラス(Wrapper Class)を指定する必要があります。int の場合は Integer を使用します。他のプリミティブ型についても同様です:

  • booleanBoolean
  • charCharacter
  • doubleDouble

9.1 数値を格納する例

import java.util.ArrayList;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> myNumbers = new ArrayList<Integer>();
    myNumbers.add(10);
    myNumbers.add(15);
    myNumbers.add(20);
    myNumbers.add(25);
    for (int i : myNumbers) {
      System.out.println(i);
    }
  }
}

10. ArrayListのソート

java.util パッケージに含まれる別の便利なクラス Collections には、リストをアルファベット順や数値順にソートするための sort() メソッドが用意されています。

10.1 文字列のソート

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

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");
    Collections.sort(cars);  // carsをソート
    for (String i : cars) {
      System.out.println(i);
    }
  }
}

10.2 数値のソート

import java.util.ArrayList;
import java.util.Collections;

public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> myNumbers = new ArrayList<Integer>();
    myNumbers.add(33);
    myNumbers.add(15);
    myNumbers.add(20);
    myNumbers.add(34);
    myNumbers.add(8);
    myNumbers.add(12);

    Collections.sort(myNumbers);  // myNumbersをソート

    for (int i : myNumbers) {
      System.out.println(i);
    }
  }
}

11. varキーワード

Java 10以降では、型を2回書かずに ArrayList 変数を宣言できる var キーワードが使用可能です。コンパイラが代入された値から型を推論します。

これによりコードは短くなりますが、可読性の観点から依然として完全な型記述を好む開発者も多いです。他のコードで見かけることもあるため、覚えておくと良いでしょう。

11.1 実装比較

// varを使わない場合
ArrayList<String> cars = new ArrayList<String>();

// varを使う場合
var cars = new ArrayList<String>();

12. Listインターフェース

Javaのコードでは、以下のように ListArrayList の両方が使われているのをよく目にします。

import java.util.List;
import java.util.ArrayList;

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

これは、変数(cars)を List(インターフェース)として宣言し、そこに ArrayList(実際の実装)を格納していることを意味します。ArrayListList インターフェースを実装しているため、このような記述が可能です。

動作は同じですが、このスタイルは「後で実装クラスを変更したい場合(例:LinkedListに変更するなど)」に柔軟性が高まるため、多くのプロフェッショナルな開発者に好まれています。