配列の操作

Javaではjava.util.Arraysに配列操作関連のユーティリティメソッドがたくさんあるので、それを中心に配列を操る。

執筆時バージョン
Java

Java SE 8

toString()

配列もオブジェクトであるためtoString()があるが、通常のObject型と同様に型情報とハッシュ値みたいな出力になる。Arrays.toString()を使うことで要素を綺麗に出力してくれる。

int[] scores = { 30, 80, 40 };
System.out.println("scores.toString()による出力:" + scores.toString());
System.out.println("Arrays.toString(scores)による出力:" + Arrays.toString(scores));
出力
scores.toString()による出力:[I@15db9742
Arrays.toString(scores)による出力:[30, 80, 40]

配列の比較

配列もオブジェクトであるためequals()がありますが、要素の中身を比較して判定はしてくれない。

なのでArrays.equals()を使う。Arrays.equals()がtrueになる条件は次の2つを満たすこと。

Arrays.equals()がtrueになる条件
  • 要素数が同じ

  • 対応する対の要素がすべて同等

多次元配列の場合はそれに対応したArrays.deepEquals()が存在する。

int[] firstArray = { 30, 80, 40 };
int[] secondArray = { 30, 80, 40 };

System.out.println("firstArray.equals(secondArray) is " + firstArray.equals(secondArray));
System.out.println("Arrays.equals(firstArray, secondArray) is " + Arrays.equals(firstArray, secondArray));
出力
firstArray.equals(secondArray) is false
Arrays.equals(firstArray, secondArray) is true

配列 → Listの変換

Arrays.asList()を使う。ただしプリミティブ型配列ではたぶん思った通りにならないので自力でやる。

参照型配列の場合

Arrays.asList()を使う。

(参照型)配列→Listの変換
String[] arrayMessages = { "good morning", "hello", "good afternoon" };
List<String> listMessages = Arrays.asList(arrayMessages);

プリミティブ型配列の場合

プリミティブ型配列ではArrays.asList()はラッパー型のListにしてと期待してしまうがそうならない。やってみようとしてもコンパイルエラーでも実行エラーでもなく、Object型の配列を作ってしまうので注意。

プリミティブ型の場合は、 Arrays.asList()ではダメ
int[] arrayScores = { 30, 80, 40 };
List<Object> fromAsListScores = Arrays.asList(arrayScores);
System.out.println(fromAsListScores);
出力
[[I@6433a2]

int型のListは結局作れないのでなんらかのラッパー型のListということになるが、どのラッパー型に変換するのかということになるので、そこら辺は結局こちらで提供しなければならない。

プリミティブ型配列→Listの変換
int[] arrayScores = { 30, 80, 40 };
List<Integer> listScores = Arrays.stream(arrayScores)
                                  .mapToObj(Integer::valueOf)
                                  .collect(Collectors.toList());

Appendix A: 参考

Appendix B: 改訂履歴

  • v1.0, 2017-04-27: 初稿