2017-06-01 38 views
9

從Java文檔爲滿足Arrays.equals(Object []對象A,對象物[] a2)的如何比較二維(或嵌套)Java陣列?

返回如果對象的兩個指定數組等於一 另一個。如果兩個陣列包含相同數量的元素,則兩個陣列被認爲是相等的,並且兩個陣列中的所有相應元素對 相等。

但是,當我運行下面的程序它打印false

Array類的equals方法不適用於多維數組嗎?

作爲以下程序的結果,我可以使用什麼API來實現true

public class Test { 
    public static void main(String[] args) { 
     String[][] rows1 = { new String[] { "a", "a" } }; 

     String[][] rows2 = { new String[] { "a", "a" } }; 

     System.out.println("Arrays.equals() = " + Arrays.equals(rows1, rows2)); 

    } 
} 
+2

https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#deepEquals-java.lang.Object:A-java.lang.Object: A- – chrylis

+0

@chrylis你應該讓你的評論t成答案。 – Ridcully

回答

28

您正在比較二維數組,這意味着這些數組的元素本身就是數組。因此,當比較元素(使用Objectequals)時,返回false,因爲Objectequals比較Object參考。

改爲使用Arrays.deepEquals

從Javadoc中:

布爾java.util.Arrays.deepEquals(對象[] A1,對象[] a2)的

返回true如果兩個指定陣列深深等於另一個。與equals(Object [],Object [])方法不同,此方法適用於任意深度的嵌套數組。

8

Arrays.deepEquals()

這就是爲什麼Arrays.equals不起作用。正如文檔所說,數組必須具有相同數量的元素,並且元素必須等於。數組的確有相同數量的元素:1.每個元素是另一個數組。

但是,這些陣列與常規方法equals比較。對於任何對象,如果對象不覆蓋爲Object定義的方法equals,則使用爲Object定義的equals方法,該方法與==相同。並且數組不會覆蓋equals(它們也不會覆蓋toString(),這就是爲什麼我們必須使用Arrays.toString()來格式化數組)。

Arrays.deepEquals()對元素是數組進行特殊檢查,然後使用遞歸Arrays.deepEquals()來測試這些數組是否相等。

0

它不按預期工作,因爲您正在使用new初始化兩個不同的對象。

從Java文檔:

boolean java.util.Arrays.equals(Object[] a, Object[] a2)

,則返回true,如果對象的兩個指定數組等於一 另一個。如果兩個陣列包含相同數量的元素,則兩個陣列被認爲是相等的,並且兩個陣列中的所有相應元素對 相等。如果(e1 == null?e2 == null:e1.equals(e2)),則認爲兩個對象e1和e2等於 。換句話說,如果兩個數組包含相同的 順序中的相同元素,則兩個數組是相等的。另外,如果兩個數組參考都是 null,則認爲兩個數組參考相等。

參數:一個陣列爲A2的其他陣列 平等被測試的相等待測試返回:如果兩個數組相等