Java:clone()和相等检查

时间:2009-10-15 20:48:14

标签: java clone equality

也许我不明白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

5 个答案:

答案 0 :(得分:11)

因为数组的equals实现与

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

另请参阅此question

在你测试的两种情况下都是错误的。原始和副本的参考值是两个不同的对象(具有相同的值但仍然是不同的对象引用)。​​

clone方法的作用是创建给定对象的副本。创建新对象时,其引用与原始对象不同。这就是equals==产生错误的原因。

如果要测试两个数组相等,请在此处执行mmyers:Arrays.equals()

答案 1 :(得分:7)

奥斯卡雷耶斯有正确的答案。我只想补充一点,Arrays.equals()完全符合您正在寻找的那种平等比较。

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

答案 2 :(得分:1)

查看Objet.clone()的javadoc,它清楚地表明虽然通常情况是:“x.clone()。equals(x)”将为真,但这不是绝对要求。

答案 3 :(得分:0)

因为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

答案 4 :(得分:0)

nums.equals(列表); //假

list == nums; //假

原因: 默认情况下,equals()的行为与“==”运算符相同,并比较对象位置。这里的nums和list有不同的内存位置。

/ *但是,equals方法实际上是指比较2个对象的内容,而不是它们在内存中的位置。 因此,为了完成它,您可以覆盖equals()方法。 * /

list [ket] == nums [ket] // True

克隆是数组的浅表副本。因此,两者都指向相同的内存位置。因此它返回true