Java入門⑫ ArrayList ── あとから増やせる、便利なまとまり

前回は「配列(たくさんのデータをまとめて持つ箱)」をやりました。

今回は、配列によく似ているけれど、もっと柔軟なArrayList(アレイリスト)です。実際の開発では、配列よりこちらをよく使います。

ArrayList とは、あとから増やしたり減らしたりできる、まとまりです。

配列の、ちょっと不便なところ

前回の配列には、不便な点がありました。最初に決めた個数を、後から変えられないのです。

int[] scores = {80, 95, 70};   // 3個で確定

この後で「4人目を追加したい」と思っても、配列のままでは簡単にはできません。弁当箱の仕切りの数が、最初から固定されているようなものです。

でも実際には、「データが何個になるか、最初は分からない」ことがほとんどです。そこで使うのが ArrayList。あとから自由に、増やしたり減らしたりできます

書き方を見てみる

ArrayList を作って、データを追加してみます。

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> scores = new ArrayList<Integer>();

        scores.add(80);
        scores.add(95);
        scores.add(70);
    }
}

記号が増えましたが、ひとつずつ見れば大丈夫です。

  • import java.util.ArrayList; … ArrayList を使う宣言(先頭に書く)
  • ArrayList<Integer> … 「整数を入れる ArrayList」という意味
  • new ArrayList<Integer>() … 空っぽの ArrayList を用意
  • scores.add(80) … ArrayList に 80 を追加する

add(追加する)で、後から1個ずつ入れていけます。最初に個数を決めなくていいのが、配列との大きな違いです。

Integer って何? ── int との違い

ここで「あれ?」と思ったかもしれません。int ではなく Integer と書いています。

ArrayList の < > の中には、int のような基本の型を、そのまま書けません。代わりに、Integer(インテジャー)という、int を包んだ箱のような型を使います。

  • int … 基本の整数型
  • Integer … int を、まとまりの中で扱えるようにした型

ややこしいですが、今は「ArrayList に整数を入れるときは Integer と書く」と覚えればOKです。文字列なら ArrayList<String>、小数なら ArrayList<Double> です。

(C#では List<int> のように基本型をそのまま書けましたが、Javaは Integer と書く必要がある。これはJava特有のクセです。)

取り出し方

中身を取り出すときは、配列とは少し違い、get を使います。

System.out.println(scores.get(0));   // 80
System.out.println(scores.get(1));   // 95
  • 配列 … scores[0](角カッコ)
  • ArrayList … scores.get(0)(get を使う)

番号が0から始まるのは、配列と同じです。

くり返しと組み合わせるのも、できます。

for (int i = 0; i < scores.size(); i++) {
    System.out.println(scores.get(i));
}

個数を調べるのは、配列の .length と違い、ArrayList は .size() です。

ArrayList にできる、便利なこと

ArrayList は、追加だけでなく、いろいろできます。

scores.add(60);          // 末尾に追加
scores.remove(0);        // 0番目を削除
scores.size();           // 個数を調べる
scores.contains(80);     // 80 が含まれているか(true / false)

「追加する」「削除する」「含まれているか調べる」。配列ではひと手間かかることが、ArrayList なら一言で書けます。この手軽さが、ArrayList がよく使われる理由です。

配列と ArrayList、どう使い分けるか

  • 配列 … 個数が最初から決まっている。サイズが変わらないとき
  • ArrayList … 個数が決まっていない。あとから増減するとき

迷ったら、「後から個数が変わるか?」を考えてみてください。変わるなら ArrayList。実際の開発では変わることが多いので、ArrayList を使う場面の方が多いです。

つまずきポイント

学生がはまるのが、intInteger の使い分けです。

ArrayList<int> scores;       // エラー!基本型は使えない
ArrayList<Integer> scores;   // 正しい

「ArrayList の中には、Integer(大文字)」。エラーが出たら、ここを疑ってみてください。普段の変数は int、ArrayList の中身は Integer、と区別しておきましょう。

まとめ

ArrayList は、あとから増減できる、柔軟なまとまり。

ArrayList<Integer> scores = new ArrayList<Integer>();
scores.add(80);                    // 追加
System.out.println(scores.get(0)); // 取り出しは get(0から)
  • add で追加、remove で削除、.size() で個数
  • 中身が整数なら Integer、文字列なら String
  • 個数が固定なら配列、変わるなら ArrayList

次回は、配列や ArrayList の中身を、もっとラクに全部取り出せる 拡張for文 を紹介します。