Java入門 STEP17|List・ArrayListを学ぼう

karin@taishi@felmia

List・ArrayListとは?

STEP8では、配列を使って複数のデータをまとめて扱う方法を学びました。

例えば、3人の名前を保存する場合は次のように書けます。

String[] names = {"田中", "佐藤", "鈴木"};

配列はシンプルで使いやすい一方、作成するときに要素数が決まるという特徴があります。

例えば、

String[] names = new String[3];

と作った配列は、3つ分の要素を持つ配列です。

実際のプログラムでは、

「あとからデータを追加したい」

「不要になったデータを削除したい」

という場面もよくあります。

そんなときに使えるのがListやArrayListです。

List・ArrayListとは?

複数のデータを順番に管理するために使います。

配列と違い、あとから要素を追加したり削除したりしやすいのが特徴です。

ルミィ
ルミィ

配列と似てるけど、あとから増やしたり減らしたりしやすいんだね♪

ArrayListを作ってみよう

まずはArrayListを作ります。

import java.util.ArrayList;

public class ArrayListBasicSample {

    public static void main(String[] args) {

        ArrayList<String> names = new ArrayList<>();

    }
}

見慣れない書き方がいくつかありますね。

順番に確認します。

まず、

import java.util.ArrayList;

は、Javaで用意されているArrayListを使うためのimportです。

そして、

ArrayList<String>

のStringは、このArrayListに入れるデータの型を表しています。

今回は名前を保存するのでStringです。

ArrayList<String> names = new ArrayList<>();

これで、Stringを複数保存できるArrayListを作ることができます。

<String>は何?

ArrayList<String>と書くことで、このArrayListにはString型のデータを入れることを表します。

例えば整数を扱う場合は、ArrayList<Integer>のように書きます。

この< >を使った仕組みはジェネリクスと呼ばれます。

まずは「中に入れるデータの型を指定している」と理解できれば大丈夫です。

add()でデータを追加する

ArrayListにデータを追加するときは、add()を使います。

先ほどのコードに名前を追加します。

import java.util.ArrayList;

public class ArrayListBasicSample {

    public static void main(String[] args) {

        ArrayList<String> names = new ArrayList<>();

        names.add("田中");
        names.add("佐藤");
        names.add("鈴木");

        System.out.println(names);
    }
}

実行結果

[田中, 佐藤, 鈴木]

add()を呼び出すたびに、データが追加されています。

配列のように、最初に「3つまで」と要素数を決めておく必要はありません。

ルミィ
ルミィ

add()するだけで増やせるんだ!
人数があとから増えるときにも使いやすそう♪

get()でデータを取得する

ArrayListから特定のデータを取得するときは、get()を使います。

import java.util.ArrayList;

public class ArrayListGetSample {

    public static void main(String[] args) {

        ArrayList<String> names = new ArrayList<>();

        names.add("田中");
        names.add("佐藤");
        names.add("鈴木");

        System.out.println(names.get(0));
        System.out.println(names.get(1));
    }
}

実行結果

田中
佐藤

get()の中に指定している数字は、配列で学んだindex(インデックス)です。

ArrayListも配列と同じように、最初の要素は0番から始まります。

ArrayListもindexは0から

names.get(0);

なら1番目、

names.get(1);

なら2番目のデータを取得します。

「1番目だからget(1)」ではない点に注意しましょう。

set()でデータを変更する

すでに入っているデータを変更するときは、set()を使います。

import java.util.ArrayList;

public class ArrayListSetSample {

    public static void main(String[] args) {

        ArrayList<String> names = new ArrayList<>();

        names.add("田中");
        names.add("佐藤");
        names.add("鈴木");

        names.set(1, "高橋");

        System.out.println(names);
    }
}

実行結果

[田中, 高橋, 鈴木]

names.set(1, "高橋");

では、indexが1の「佐藤」を「高橋」に変更しています。

set()は、

set(index, 新しい値)

という形で使います。

remove()でデータを削除する

データを削除するときは、remove()を使います。

import java.util.ArrayList;

public class ArrayListRemoveSample {

    public static void main(String[] args) {

        ArrayList<String> names = new ArrayList<>();

        names.add("田中");
        names.add("佐藤");
        names.add("鈴木");

        names.remove(1);

        System.out.println(names);
    }
}

実行結果

[田中, 鈴木]

indexが1の「佐藤」が削除されました。

削除すると、その後ろにあったデータは前に詰められます。

そのため削除後は、

田中 → index 0
鈴木 → index 1

となります。

size()で要素数を調べる

現在いくつのデータが入っているのかを調べるには、size()を使います。

import java.util.ArrayList;

public class ArrayListSizeSample {

    public static void main(String[] args) {

        ArrayList<String> names = new ArrayList<>();

        names.add("田中");
        names.add("佐藤");
        names.add("鈴木");

        System.out.println(names.size());
    }
}

実行結果

3

ここは配列との違いにも注意してください。

配列では、

names.length

でした。

ArrayListでは、

names.size()

を使います。

配列とArrayListの要素数

配列

配列名.length

ArrayList

ArrayList名.size()

配列のlengthには()がなく、ArrayListのsize()には()があります。

拡張forで順番に取り出す

ArrayListの中身をすべて順番に処理したい場合は、STEP8でも登場した拡張forが使えます。

import java.util.ArrayList;

public class ArrayListLoopSample {

    public static void main(String[] args) {

        ArrayList<String> names = new ArrayList<>();

        names.add("田中");
        names.add("佐藤");
        names.add("鈴木");

        for (String name : names) {
            System.out.println(name);
        }
    }
}

実行結果

田中
佐藤
鈴木

ArrayListの中から1つずつStringを取り出して、nameに入れています。

すべての要素を順番に処理したいだけなら、indexを自分で指定する必要がないため、拡張forを使うとシンプルに書けます。

ListとArrayListは何が違う?

ここまでArrayListを直接使ってきましたが、実際のJavaコードでは次の書き方もよく見かけます。

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

public class ListBasicSample {

    public static void main(String[] args) {

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

        names.add("田中");
        names.add("佐藤");
        names.add("鈴木");

        System.out.println(names);
    }
}

注目するのは、

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

です。

左側がList、右側がArrayListになっています。

Listはインターフェース、ArrayListはそのListを実装したクラスです。

STEP15で、

Movable dog = new Dog();

のように、インターフェース型で実装クラスのオブジェクトを扱えることにつながっています。

同じように、

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

と書くことができます。

ListとArrayListの関係

Listはインターフェースです。

ArrayListはListを実装しているクラスの1つです。

そのため、

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

という書き方ができます。

実際のJavaコードでもよく使われる形なので、少しずつ慣れていきましょう。

ルミィ
ルミィ

STEP15のインターフェースがここでも出てきた!
前に覚えたことが実際のJavaの書き方につながってるんだね♪

なぜList型で書くの?

では、

ArrayList<String> names = new ArrayList<>();

ではなく、

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

と書くことがあるのはなぜでしょうか。

Listはインターフェースなので、「Listとしてどのような操作ができるか」を基準にして扱うことができます。

ArrayListは、そのListを実装したクラスのひとつです。

そのため、実際のJavaコードでは次のように書くことがよくあります。

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

これはSTEP15で学んだインターフェースと、STEP16で学んだポリモーフィズムにつながる書き方です。

最初は、

「Listはインターフェース、ArrayListはその実装クラス」

「変数の型にはListを使う書き方がよく使われる」

と覚えておけば大丈夫です。

配列とArrayListの違い

ここまでの違いを簡単に整理します。

配列

  • 作成するときに要素数を決める
  • 要素の取得には[index]を使う
  • 要素数はlengthで確認する

ArrayList

  • あとから要素を追加・削除しやすい
  • 追加はadd()
  • 取得はget()
  • 変更はset()
  • 削除はremove()
  • 要素数はsize()

配列が不要になるわけではありません。

どちらもJavaで使われるので、用途に合わせて使い分けます。

初心者のうちはまず、要素数が変わるデータを扱いやすいのがArrayListという違いから覚えておけば大丈夫です。

よくある間違い

indexを1から数えてしまう

ArrayListも配列と同じく、indexは0から始まります。

names.get(0);

が最初の要素です。

配列と同じ書き方で取得しようとする

配列では、

names[0]

と書きます。

ArrayListでは、

names.get(0)

です。

lengthを使ってしまう

ArrayListの要素数は、

names.size()

で取得します。

配列のlengthと混同しやすいので注意しましょう。

importを忘れる

ListやArrayListを使う場合は、importが必要です。

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

EclipseなどのIDEを使っている場合は、importの自動補完を利用することもできます。

STEP17のまとめ

STEP17のポイント

  • ArrayListは複数のデータをまとめて管理できる
  • 配列と違い、あとから要素を追加・削除しやすい
  • add()で追加する
  • get()で取得する
  • set()で変更する
  • remove()で削除する
  • size()で要素数を取得する
  • indexは配列と同じく0から始まる
  • Listはインターフェース、ArrayListはその実装クラス
  • List<String> names = new ArrayList<>();という書き方がよく使われる

最初は、「配列よりもデータの追加や削除がしやすく、add()やget()などのメソッドを使って操作する」と理解できれば大丈夫です。

ルミィ
ルミィ

STEP17クリア!
配列と似てるけど、増やしたり減らしたりできるのが便利だね♪

次のSTEPへ

次のSTEPでは、データを「キー」と「値」の組み合わせで管理できるMapについて学びます。

Listでは、

0 → 田中
1 → 佐藤
2 → 鈴木

のようにindexを使ってデータを管理していました。

Mapでは、

商品A → 120
商品B → 180

のように、キーを使って対応する値を管理できます。

「商品名と価格」「社員番号と社員名」のように、2つの情報を対応させて管理したいときに便利な仕組みです。

→ STEP18「Map・HashMapを学ぼう」

学習内容を確認したいときは、Java入門の一覧から各STEPを確認できます。

→ Java入門|初心者が基礎から学べるJava学習ガイド

記事URLをコピーしました