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