[英]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.