配列の基本

配列は値の集合で、同じデータ型の値をまとめて扱うことができるもの。加えてJavaの配列はオブジェクトでもある。

配列とは

配列は値の集合で、同じデータ型の値をまとめて扱うことができるもの。配列の概念自体は他のプログラミング言語(CやRuby)でもだいたいある。

変数だけでは値を1つしか保持できない。プログラムにおいては大量のデータをさばくことがが求められるので、変数だけでは困ってしまう。例えばテストの点を管理するアプリケーションの場合、生徒一人ずつに変数を割り当てるのかってことになってしまう。よって値をまとめて扱うことができる集合の概念が必要となり、配列やコレクションが提供されている。

配列の主な特徴。

  • 要素数は1度生成すると変えられない

  • インデックス(添字)は0から始まりn-1までとなる

Javaの配列の主な特徴。

  • 配列がオブジェクトであること(後述)

できればコレクションを使う

値の集合という意味であれば配列の他にもコレクションがあり、基本的にはコレクションの方を使うようにする。コレクションの方が可能な操作は多いし、配列よりはるかに手広いし安全。またJavaの配列では微妙な点(型安全ではないなど…​)があるので、やっぱりコレクションを優先して使うように心がける。積極的に使うのは数値計算の場合など。

配列の生成と初期化

複数の方法がある。

int[] scores = new int[5];

こちらの書式では、要素数5で値が全て0のint型配列が生成される。要素数は指定された数で確定し、値としては(フィールドなどと同様に)デフォルト値が設定される。

int[] scores = {30,80,40,20,70};

こちらは配列初期化子という書き方。{}を使って値を指定する。この例であれば、要素数5で値が30,80,40,20,70のint型配列が生成される。値は後から変更できるが要素数はこの数で変更できなくなるので、要素数の間違えは注意する。

この書き方は次の書き方の省略したもの。

int[] scores = new int[]{30,80,40,20,70};

配列へのアクセス

配列の変数に対して、[]内にインデックス(添字)を指定することで値にアクセスできる。存在しないインデックスにアクセスしようとするとArrayIndexOutOfBoundsExceptionが発生する。

int[] scores = new int[] { 30, 80, 40, 20, 70 };
System.out.println("1番目の値は" + scores[0] + "です。");

for文で全要素にアクセスする場合は、こんなかんじ。lengthフィールドが要素数を保持しているので、i=0からi < lengthまでで全てのインデックスを現わすことができる。

int[] scores = new int[] { 30, 80, 40, 20, 70 };
for (int i = 0; i < scores.length; i++) {
  System.out.println(scores[i]);
}

インデックスを操作する必要が無いのであれば、拡張for文の方がインデックス用の変数を持たなくていいのでスッキリする。

int[] scores = new int[] { 30, 80, 40, 20, 70 };
for (int score : scores) {
  System.out.println(score);
}

Streamももちろん生成可能。Arrays#stream()を利用する。

int[] scores = new int[] { 30, 80, 40, 20, 70 };
Arrays.stream(scores)
      .forEach(System.out::println);

オブジェクトであること

Javaの場合は配列がオブジェクトであるため、Object型のメソッドなどが利用できる。加えて、lengthフィールドとclone()メソッドが利用できる。

ただObject型にキャストできたりもしてしまうので微妙。

lengthフィールド

要素数が保持されたフィールド。配列は生成してしまえば要素数を変えられないので、lengthフィールドも変わらない(finalとなっている)。インデックスを用いたfor文でのアクセスなどで利用する。

多次元配列

配列の配列という形で、2次元でも3次元でも作成できる。