配列の操作

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

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

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()

配列もオブジェクトであるためequals()がありますが、要素の中身を比較して判定はしてくれない。Arrays.equals()やArrays.deepEquals()を使う。Arrays.equals()とArrays.deepEquals()の違いは多次元配列に対応しているか否か。

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

  • 要素数が同じ

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

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: 参考