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