Java:clone()和相等检查

也许我不明白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%5B%5D,%20int%5B%5D%29

nums.equals(列表); //假

list == nums; //假

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

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

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

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