“朋友,我希望你现在已经意识到数组在编程中有多么有用了?”

“毫无疑问,Rishi!我已经完成了不止一项任务。”

“你的任务有没有重复的动作?你一遍又一遍地做的那种。”

“如果我没理解错的话,你的意思是在不同的任务中执行类似的操作?例如,到处都使用循环来显示数组的内容——我已经厌倦了那样做!”

“是的,这就是我的意思。Java 的创造者注意到 Java 程序员在使用数组时经常编写相同的代码。例如,将数组的一部分复制到另一个数组的代码,或者用相同的代码填充数组的每个单元格的代码值。或者你的例子:在屏幕上以可读形式显示数组内容的代码。

“真正的程序员有一个非常重要的规则:不要重复自己。你会同意做多余的工作是错误的——你不会因此得到报酬。有效的工作是高薪的,相信我。顺便说一句,新手的大量重复代码立即可识别代码。

“Java的创造者深思熟虑,创造了一个特殊的Arrays类(全称java.util.Arrays),将最流行的数组相关动作放入其中。”

“嗯……很有意思,那它到底有什么?

“它有很多适用于各种场合的方法,但首先我们只考虑其中的 10 种——最简单和最常用的。

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?]"

Arrays.deepToString()

“但是,toString()对于二维数组,该方法并不适用。换句话说,如果您尝试调用Arrays.toString(),您会看到一些熟悉的东西:

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

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

“那怎么办?如何正确显示一个二维数组?”

“Java 的创造者也预料到了这一点。为此,该类Arrays有另一个特殊的方法—— deepToString()。调用它看起来像这样:

String str = Arrays.deepToString(name);

“此方法可以传递二维、一维、三维或一般情况下任何维度的数组,并且它将始终显示数组的元素。

例子:

int[] 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]], [[]]]"

Arrays.equals()

“我们想出了如何在屏幕上显示数组。比较数组呢?你还记得我们可以用什么方法来比较字符串吗?”

“我一般用的equals方法!

"Yes, equals, and also equalsIgnoreCase(比较字符串而不考虑大写和小写)。

“好消息:你也可以使用equals数组的方法。坏消息:它不比较数组的内容。equals数组的方法与运算符做同样的事情==——它比较引用。

例子:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
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(数组的内容不同)

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(内容相同)

“谢谢你,Rishi!这节课正是我所需要的,让我以后的生活更轻松、更快乐。现在我将使用 Arrays 类的方法,更快地编写我的程序。

“这就是我所指望的,哈哈。但是这些并不是 Arrays 类中所有有趣的方法。下次我会告诉你其他的。”