簡體   English   中英

Java:clone()和相等檢查

[英]Java: clone() and equality checks

也許我不明白clone()是如何工作的。 返回值不應該等於調用者嗎?

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

因為數組的equals實現與Object相同

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

這也是這個問題

在你測試的兩種情況下,這都是錯誤的。 原始和副本的參考值是兩個不同的對象(具有相同的值但仍然是不同的對象引用)。

clone方法的作用是創建給定對象的副本。 創建新對象時,其引用與原始對象不同 這就是為什么equals==產生錯誤的原因。

如果你想測試兩個數組相等,那么在這里做mmyers: Arrays.equals()

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

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

看看Objet.clone()的javadoc,它清楚地表明雖然通常情況是:“x.clone()。equals(x)”將為真,但這不是絕對的要求。

因為num.equals不會檢查元素是否相等,但它會檢查這兩個變量是否指向同一個對象。 在您的情況下,雖然元素是相同的,但nums和列表指向兩個不同的對象。

你可以使用java.util.Arrays.equals(...)函數來進行比較。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals%28int[],%20int[]%29

nums.equals(列表); //假

list == nums; //假

原因:默認情況下,equals()的行為與“==”運算符相同,並比較對象位置。 這里的nums和list有不同的內存位置。

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

list [ket] == nums [ket] //真

克隆是數組的淺表副本。 因此,兩者都指向相同的內存位置。 因此它返回true

暫無
暫無

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

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