“朋友,我希望你現在已經意識到數組在編程中有多麼有用了?”

“毫無疑問,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 類中所有有趣的方法。下次我會告訴你其他的。”