3

也许我不明白它是如何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
4

5 回答 5

11

因为 array 的 equals 实现与 Object 相同,即

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

另见this question

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

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

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

于 2009-10-15T20:51:15.300 回答
7

奥斯卡雷耶斯有正确的答案。我只是补充一下,Arrays.equals()这正是您正在寻找的那种平等比较。

int[] nums = new int[] {0, 1, 2};
int[] list = nums.clone();
System.out.println(Arrays.equals(nums, list)); // prints "true"
于 2009-10-15T20:53:57.807 回答
1

查看Objet.clone()的 javadoc ,它清楚地指出,虽然通常情况下:“x.clone().equals(x)” 将是正确的,但这不是绝对要求。

于 2009-10-15T20:55:00.883 回答
0

因为 num.equals 不检查元素的相等性,但它检查两个变量是否指向同一个对象。在您的情况下,虽然元素相同,但 nums 和 lists 指向两个不同的对象。

您可以使用 java.util.Arrays.equals(...) 函数进行比较。

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

于 2009-10-15T20:54:30.163 回答
0

nums.equals(列表);//错误的

列表 == 数字;//错误的

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

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

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

克隆是数组的浅拷贝。因此,两者都引用相同的内存位置。因此它返回true

于 2015-07-22T09:00:20.497 回答