簡體   English   中英

Java:如何測試數組相等性?

[英]Java: How to test on array equality?

為什么下面的代碼打印"Different." ?

boolean[][] a = { {false,true}, {true,false} };
boolean[][] b = { {false,true}, {true,false} };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");

為什么下面的代碼打印"Different." ?

因為Arrays.equals執行的是比較。 由於數組從Object繼承了它們的equals方法,因此將對內部數組執行標識比較,這將失敗,因為ab不引用相同的數組。

如果您更改為Arrays.deepEquals ,它將打印"Equal." 正如預期的那樣。

真的不明顯。

首先, ==運算符只是比較兩個指針。 因為ab是位於不同內存地址的不同對象,所以a == b將返回false (嘿,Java 純粹主義者,我知道==實際上比較對象標識。我只是想說教)。

現在讓我們看看數組equals()實現:

boolean[] c = new boolean[] { false, true, false };
boolean[] d = new boolean[] { false, true, false };

if (c.equals(d)) {
    System.out.println("Equals");
} else {
    System.out.println("Not equals");
}

這將打印Not equals因為沒有數組實例實際實現equals()方法 所以,當我們調用<somearray>.equals(<otherarray>)我們實際上是在調用Object.equals()方法,它只是比較兩個指針。

也就是說,請注意您的代碼實際上是這樣做的:

boolean[] a0 = new boolean[] { false, true };
boolean[] a1 = new boolean[] { true, false };
boolean[] b0 = new boolean[] { false, true };
boolean[] b1 = new boolean[] { true, false };
boolean[][] a = new boolean[][] { a0, a1 };
boolean[][] b = new boolean[][] { b0, b1 };

if (Arrays.equals(a, b) || a == b)
    System.out.println("Equal.");
else
    System.out.println("Different.");

Arrays.equals(a, b)最終將調用a0.equals(b0) ,它將返回false 出於這個原因, Arrays.equals(a, b)也會返回false

所以你的代碼將打印Different. 我們得出結論,Java 相等性有時會很棘手。

對多維數組使用 Arrays.deepEquals()。

public static boolean equal(double[][] a, double[][] b) {
        if (a == null) {
            return (b == null);
        }
        if (b == null) {
            return false;  // already know 'a' isn't null
        }
        if (a.length != b.length) {
            return false;
        }
        for (int i = 0; i < a.length; i++) {
            if (!Arrays.equals(a[i], b[i])) {
                return false;
            }
        }
        return true;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM