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

但是,如果您尝试将二维数组转换为字符串(以显示它)using the Arrays.toString()方法,您会看到一些熟悉的东西:

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

这都是因为二维数组的单元格存储了对一维数组的引用。一维数组如何转换为字符串?正如您在上面看到的那样。

可以做什么?我们如何正确显示一个二维数组呢?

为此,该类Arrays还有一个特殊的方法—— deepToString(). 调用它看起来像这样:

String str = Arrays.deepToString(name);

此方法可以传递二维、一维、三维或一般情况下任何维度的数组,并且它将始终显示数组的元素。
注意:Arrays.deepToString()方法不适用于基元的一维数组(例如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()

我们想出了如何在屏幕上显示数组,但是比较数组呢?

比较字符串,我们有equalsandequalsIgnoreCase方法,但是数组有什么方法呢?

好消息是数组有一个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);
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);
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方法不适用于二维数组:它将二维数组视为一维数组,其元素是一维数组的地址。

因此,为了正确比较多维数组 ( 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);
equals的方法只是arrays 比较两个数组的引用。

false(引用不相等)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.equals(x1, x2);
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(内容相同)