2011-12-05 24 views
5

嘿,我目前正在學習java決賽,我很困惑於一個簡單的equals方法。數組的等值方法是如何工作的?

給出的問題是

「鑑於以下數組聲明,什麼是以下打印」

,我想複製後然而這將是真的,假的,真實和粘貼代碼揭示答案是錯誤的,錯誤的,真實的。

據我所知,==只適用於他們是對象的同一實例,但我不明白爲什麼第一個是假的。我試圖找到數組api中的方法,但無法找到具有相同參數的方法。

請原諒我,如果這是顯而易見的,我在過去的幾個晚上學習的時間已經很晚了,而且現在對咖啡因也很厭倦。

int[] d = { 1, 2, 3 }; 
int[] b = { 1, 2, 3 }; 
int[] c = d; 
System.out.println(d.equals(b)); 
System.out.println(d == b); 
System.out.println(d == c); 

回答

16

基本上,數組類型不重寫equals提供價值相等...所以你最終在對象的默認實現,這是引用相等。

對於數組中的值相等(即相同順序中的元素相同),請使用Arrays類中的靜態方法。

+1

+1提供了關於如何實現序列/值相等(而不是因爲你是Jon Skeet)的提示。 –

+1

爲了完成這個想法,有幾個重載'Arrays.equals',以及'數組。deepEquals(Object,Object)',它可以給你一個更「自然」的平等。 – yshavit

+0

對象有一個平等的方法....我知道我想不出來,我現在睡覺後得到它。非常感謝你幫助我理解! – Erik

3

普通Java數組(即不是ArrayList或其他類)本身並不實現equals,而是使用Object中的實現。這基本上只是一個地址比較。

(但請注意,java.util.Arrays中實現一些靜態equals方法通用陣列。)

1

數組是一個對象,它不重寫的Object.Equals(),所以標準的實施對象.equals()適用。 array.equals(something)當且僅當array == something是真實的。

1

數組暗含擴展Object類。所以,你的equals方法是從那裏繼承的。方法equals的默認實現只是檢查標識符相等性,即與==相同。

1

對於==運算符只是比較引用的相等性,所以第二個和第三個打印語句按照您的預期進行操作是正確的。

.equals方法可能會通過除引用相等之外的其他方法進行比較,但這需要類定義來實際實現該方法。如果.equals沒有在數組類中實現,那麼運行時將回退到Object#equals,這與您在==運算符中找到的引用相同。

換句話說,似乎在數組的支持類中沒有.equals方法,或者它的實現方式與逐個元素的比較不同。

相關問題