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