1.Arraysクラス

前に述べたように、配列は非常に便利で、プログラミングで頻繁に使用されます。

Java の作成者は、Java プログラマが配列を扱うときに同じコードを書くことが多いことにすぐに気づきました。たとえば、配列の一部を別の配列にコピーしたり、配列の各セルに同じ値を入力するコードを作成したり、配列の内容を便利な形式で表示したりできます。

そのため、特別なArraysクラス (正式名はjava.util.Arrays) を作成し、最も一般的な配列関連のアクションをそのクラスに組み込みました。

あらゆる場面に対応する多くの方法がありますが、最初に、そのうちの最も単純で最も頻繁に使用される 10 個だけを検討します。


2.Arrays.toString()

最初に説明するメソッドは と呼ばれますArrays.toString()。まず最初に、背景について少し説明します。

Java の各配列にはtoString()、「配列のテキスト表現」を返すメソッドがあります。次のステートメントを使用して、配列のテキスト表現を取得できます。

String str = name.toString();

ここでname、 は配列変数の名前、 はstr配列の文字列表現を格納する変数の名前です。

ただし、 メソッドを使用して配列を画面に出力しようとすると、おそらく次のような内容が表示されるでしょう。System.out.println(name)

I@37afeb11

最初の文字は配列Iであることを意味しint、その後の記号は@メモリ内の配列のアドレスです。一方では、これはまさに配列変数に格納されている情報ですが、他方では、何か違うものを期待していましたよね。

配列内の値を確認したかったのです。Arrays.toString()そしてまさにそれが、配列の値を表示するという方法を思いついた理由です。これを次のように呼びます。

String str = Arrays.toString(name);

例:

int[] array = {1, 2, 3};
String str = Arrays.toString(array);
変数strには次の文字列が含まれます。
"[1, 2, 3]"
int[] array = {};
String str = Arrays.toString(array);
変数strには次の文字列が含まれます。
"[]"
String[] array = {"Hi", "How's", "life?"};
String str = Arrays.toString(array);
変数strには次の文字列が含まれます。
"[Hi, How's, life?]"


3.Arrays.deepToString()

しかし、2 次元配列を (表示するために) 文字列using the Arrays.toString()メソッドに変換しようとすると、見覚えのあるものが表示されます。

[I@37afeb11, I@37afeb21, I@37afeb31]

これはすべて、2 次元配列のセルに 1 次元配列への参照が格納されているためです。そして、一次元配列はどのように文字列に変換されるのでしょうか? まさに上で見たとおりです。

何ができるでしょうか?2 次元配列を正しく表示するにはどうすればよいでしょうか?

この目的のために、Arraysクラスには別の特別なメソッドがあります — deepToString()。呼び出すと次のようになります。

String str = Arrays.deepToString(name);

このメソッドには、2 次元、1 次元、3 次元、または一般に任意の次元の配列を渡すことができ、常に配列の要素が表示されます。
注:このArrays.deepToString()メソッドは、プリミティブの 1 次元配列 (たとえば、int[]) では機能しません。

例:

Integer[] array = {1, 2, 3};
String str = Arrays.deepToString(array);
変数strには次の文字列が含まれます。
"[1, 2, 3]"
int[][] array = { {1, 1}, {2, 2}, {3, 3} };
String str = Arrays.deepToString(array);
変数strには次の文字列が含まれます。
"[[1, 1], [2, 2], [3, 3]]"
int[][][] array = { {{1, 2, 3}, {1}}, {{}} };
String str = Arrays.deepToString(array);
変数strには次の文字列が含まれます。
"[[[1, 2, 3], [1]], [[]]]"


4.Arrays.equals()

画面上に配列を表示する方法はわかりましたが、配列を比較する場合はどうすればよいでしょうか?

文字列を比較するにはequalsequalsIgnoreCaseメソッドがありますが、配列にはどのようなメソッドがあるのでしょうか?

良いニュースは、配列にはequalsメソッドがあるということです。悪いニュースは、配列の内容を比較しないことです。配列のメソッドは演算子equalsと同じことを行い==、参照を比較します。例:

例:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
boolean b = x1 == x2;


false(参照が等しくない)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
2 つの配列の参照を単純に比較するequals方法。(参照が等しくない) arrays

false

何ができるでしょうか?配列の内容に基づいて配列を比較するにはどうすればよいでしょうか?

そして再びArrays、 、より具体的にはそのArrays.equals()方法が私たちの助けになります。これを次のように呼びます。

Arrays.equals(name1, name2)

このメソッドは、true配列の長さが同じで、その要素が等しい場合に戻ります。それ以外の場合は、 を返しますfalse

例:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
2 つの配列の参照を単純に比較するequals方法。(参照が等しくない) arrays

false
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
Arrays.equals(x1, x2);


true(内容は同等です)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3, 4};
Arrays.equals(x1, x2);


false(配列の内容が異なります)

5.Arrays.deepEquals()

そして、おそらくすでにご想像のとおり、このArrays.equalsメソッドは 2 次元配列に対しては正しく機能しません。このメソッドは、要素が 1 次元配列のアドレスである 1 次元配列のように 2 次元配列を扱います。

そこで、多次元配列 ( n = 1, 2, 3,...) を正確に比較するために、彼らはこの方法を思いつきましたArrays.deepEquals()。呼び出すと次のようになります。

Arrays.deepEquals(name1, name2)

メソッドは戻りますtrue配列の長さが同じで、その要素が等しい場合。それ以外の場合は返されますfalse。配列内の要素も配列である場合、Arrays.deepEquals()メソッドはそれらを比較するために使用されます。

例:

int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
x1.equals(x2);
2 つの配列の参照を単純に比較するequals方法。(参照が等しくない) arrays

false
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.equals(x1, x2);
このメソッドは、 と を参照を格納する 1 次元配列としてArrays.equals比較します。それらにはさまざまな参照が含まれています。(配列の内容は等しくない) x1x2
false
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.deepEquals(x1, x2);


true(内容は同等です)