2009-10-15 52 views
3

也許我不明白clone()是如何工作的。返回值不應該等於主叫方嗎?Java:克隆()和等式檢查

int[] nums = new int[] {0, 1, 2}; 
int[] list = nums.clone(); 
nums.equals(list); //returns false. Why? 

for (int ket = 0; ket < list.length; ket++) { 

     System.out.println(list[ket] == nums[ket]); //prints out true every time 
} 

list == nums //false 

回答

11

因爲平等實現陣列的是一樣的對象,它是

public boolean equals(Object o) { 
    return this == o; 
} 

見這也是這個question

和你測試這兩種情況下,那是假的。原始參考值和副本參考值是兩個不同的對象(具有相同的值但仍不同的對象參考)。

克隆方法所做的是創建給定對象的副本。當創建新對象時,其原始參考是不同於。這就是爲什麼equals==產生錯誤。

如果你想測試相等的兩個數組,這裏做的mmyers:Arrays.equals()

+0

這是迄今爲止的最佳答案(獎勵它)。當你正在考慮實現Cloneable,或者重寫equals或hashcode時,請閱讀:http://www.javaworld.com/javaworld/jw-01-1999/jw-01-object.html 我的通用建議是:使用Cloneable/clone(),但使用複製構造函數(僅將當前Class的實例作爲參數)複製。節省自己的痛苦。 – 2009-10-15 21:28:19

7

奧斯卡雷耶斯有正確的答案。我只是補充一點,Arrays.equals()確實是你正在尋找的那種平等比較。

int[] nums = new int[] {0, 1, 2}; 
int[] list = nums.clone(); 
System.out.println(Arrays.equals(nums, list)); // prints "true" 
+0

+1來完成答案。我鏈接你我:) – OscarRyz 2009-10-15 21:00:57

1

看一看的Javadoc Objet.clone(),它明確指出,雖然這是通常的情況是:「x.clone()等於(X)」將是真實的,這不是一個絕對要求。

0

nums.equals(list); // false

list == nums; // false

原因: 默認情況下,equals()將表現爲與「==」運算符相同並比較對象位置。這裏nums和list有不同的內存位置。

/*但是,equals方法實際上是爲了比較2個對象的內容,而不是它們在內存中的位置。 因此,爲了完成它,你可以重寫equals()方法。 */

列表[KET] == NUM​​S [KET] //真

該克隆是陣列的淺表副本。所以,兩者都指向相同的內存位置。因此它返回true