2009-10-15 63 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