[英]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
方法,因此將對內部數組執行標識比較,這將失敗,因為a
和b
不引用相同的數組。
如果您更改為Arrays.deepEquals
,它將打印"Equal."
正如預期的那樣。
真的不明顯。
首先, ==
運算符只是比較兩個指針。 因為a
和b
是位於不同內存地址的不同對象,所以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.