Javaでは、配列はすべて同じデータ型の要素の集まりでした。配列は、複数の値を1つの変数に格納するために使用されるオブジェクトです。
Arraysクラスは、Java Standard Edition(SE)の一部であるjava.utilパッケージに属し、配列を操作する(ソートや検索など)ためのさまざまなメソッドを含むユーティリティクラスです。ユーティリティクラスとは、java.lang.Mathなど、staticなメソッドと変数だけが含まれているクラスのことで、特定の処理を実行するためのメソッドを集めたクラスを指します。
ユーティリティクラスは通常、静的メソッドとして使用するように設計されています。つまり、クラスのインスタンスを生成することなく呼び出すことができます。Arraysクラスは、int, double, charなどのプリミティブなデータ型と、オブジェクトの配列に対してオーバーロードされたメソッドのセットを提供します。これにより、データ型ごとに別々のメソッドを記述することなく、同じメソッドで異なるデータ型の配列を操作することができます。
java.utilパッケージのArraysクラスは、配列を操作するためのさまざまなメソッドを提供します。例えば、2つの配列が等しいかどうかを比較したり、配列をソートしたり、配列に対する操作をいくつも提供しています。
それでは配列をソートしてみます。Arraysクラスのsortメソッドについて見てみましょう。ソートにはデュアルピボットクイックソートが使用されます。
// Arraysクラスのimport
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] numbers = {34,2,11,23,0};
Arrays.sort(numbers);
for (int number : numbers) {
System.out.println(number);
}
String[] names = {"Steve","Alice","Ema","Jack"};
Arrays.sort(names);
for (String name : names) {
System.out.println(name);
}
}
}
Arraysクラスのequalsメソッドは、Javaのクラス階層のルートであるjava.lang.Objectクラスから継承されます。java.util.Arraysクラスの場合、equalsメソッドをオーバーライドして、配列に特化した実装を提供します。
Arraysクラスのequalsメソッドを使うと、2つの配列が等しいかどうかを比較することができます。equalsメソッドは,2つの配列を引数として受け取り、2つの配列が等しい場合はtrueを、等しくない場合はfalseを返します。
equalsメソッドを使用する場合、配列の要素の順序は重要です。同じ要素を同じ順番で持っている場合、等しいとみなされ、要素の順番が異なる場合、等しいとはみなされません。それでは例を見てみましょう。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5};
int[] arr2 = {1,2,3,4,5};
int[] arr3 = {5,4,3,2,1};
System.out.println(Arrays.equals(arr1, arr2));
System.out.println(Arrays.equals(arr1, arr3));
}
}
JavaでSystem.out.printlnメソッドを使って配列を出力すると、通常、配列のデータ型と配列のメモリアドレスを表すハッシュコードが出力されます。
int[] numbers = {1,2,3,4,5};
System.out.println(numbers); // [I@d716361
出力は、[I]という接頭辞で示される配列のデータ型から始まります。Iはintを表し,配列が整数の配列であることを示しています。記号の後には16進数のハッシュコードが続きますが、これはJavaヒープにおける配列オブジェクトのメモリアドレスを表しています。
このデフォルトの出力は、配列の内容を出力するにはあまり便利ではありません。配列の内容を表示するには、次のようにArraysクラスのtoStringメソッドを使用することができます。
JavaにおけるtoStringメソッドは、Javaのクラス階層のルートであるObjectクラスで定義されているメソッドです。すべてのJavaクラスで継承され、オブジェクトを文字列表現に変換するために使用されます。
ObjectクラスのtoStringメソッドのデフォルトの実装は、オブジェクトのメモリアドレスの文字列表現をclassname@hashcodeの形で返します。たとえば、以下のようになります。
Object obj = new Object();
System.out.println(obj.toString()); // java.lang.Object@6ff3c5b5
しかし、JavaのほとんどのクラスはtoStringメソッドをオーバーライドして、より意味のあるオブジェクトの文字列表現を提供します。配列に使用してみましょう。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] numbers = {1,2,3,4,5};
System.out.println(numbers);
System.out.println(Arrays.toString(numbers));
String[] names = {"Steve","Alice","Ema"};
System.out.println(names);
System.out.println(Arrays.toString(names));
}
}
Arraysクラスのfillメソッドは、配列に与えられた値を埋めるために使用されるメソッドです。以下のような形で利用可能です。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
boolean[] flags = new boolean[5];
Arrays.fill(flags, false);
System.out.println(Arrays.toString(flags));
}
}
ArraysクラスのcopyOfメソッドは、配列のコピーを作成するために使用されるメソッドです。これらのメソッドは、それぞれ指定した配列のコピーを作成し、そのコピーを新しい配列として返します。copyOfメソッドはコピー元の配列と、新しい配列の長さを引数として受け取ります。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] numbers = {1,2,3,4,5};
int[] copy = Arrays.copyOf(numbers, numbers.length);
System.out.println(Arrays.toString(copy));
}
}
copyOfメソッドは、配列のディープコピーを作成します。オブジェクトのディープコピーとは、元のオブジェクトと同じ値を参照するプロパティを持たないコピーのことです。その代わり、それ自身の独立したプロパティ値のセットを持ちます。つまり、コピーは独自の要素を持つ新しい配列であり、コピーの要素に加えられた変更は元の配列に反映されません。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] numbers = {1,2,3};
int[] copy = Arrays.copyOf(numbers, numbers.length);
copy[0] = 0; // 新しい配列の要素の値を変更
// 元の配列へ反映されない
System.out.println(Arrays.toString(numbers));
System.out.println(Arrays.toString(copy));
}
}
新しい長さが元の配列の長さよりも長い場合、新しい配列は要素の型のデフォルト値(例えば、整数の場合は0、booleanの場合はfalseなど)で埋められます。新しい長さが元の配列の長さよりも短い場合は、新しい配列には元の配列の最初のN個の要素が含まれます(N は新しい長さ)
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] numbers = {1,2,3};
int[] copy1 = Arrays.copyOf(numbers,1);
int[] copy2 = Arrays.copyOf(numbers,10);
System.out.println(Arrays.toString(copy1));
System.out.println(Arrays.toString(copy2));
}
}
配列については、CS基礎/中級/リストで詳しく学習できます。