如果我使用{A.equals(B)
启动false
,当我使用B
int[] B = A.clone()
启动true
时,有人可以解释为什么B
为int[] B = A
{1}}?
int[] A = {1, 2, 3, 4, 5};
int[] B = A;
//int[] B = A.clone();
if(A==B){//true
System.out.println("Equal");
}
if(A.equals(B)){//true
System.out.println("Equal");
}
答案 0 :(得分:4)
显然,Java中数组的equals
方法是比较引用相等性(与==
相同)。
如果你克隆它,你有一个引用不同的对象 - 克隆数组。但是,如果你只是指向它的另一个引用它是相同的。
答案 1 :(得分:3)
好吧,如果你使用
int[] B = A;
然后B
和A
引用相同的对象,因此它们是平等的。第一个比较(==)肯定在A
和A.clone()
之间返回false,因为值指的是不同的对象。听起来数组不会覆盖equals
(例如ArrayList
),因此克隆不等于equals
方法下的原始数据。
编辑:的确,从语言规范section 10.7, Array Members:
所有成员都继承自Object类;唯一没有继承的Object方法是它的克隆方法。
换句话说,数组会覆盖clone()
但不覆盖toString
/ hashCode
/ equals
。
答案 2 :(得分:2)
为了比较Java中的数组,您可能想尝试
java.util.Arrays.equals(a,b);
如果你使用a == b
它们应该是不同的 - 这会比较它们的记忆参考。
如果您使用a.equals(b)
,它可能会继承自Object,它只使用==
。
这可能解释了为什么他们首先制作了Arrays.equals()。现在为什么他们选择a.equals(b)来比较元素......很难说。
答案 3 :(得分:0)
你的问题正由克隆()的Javadoc精确回答:
http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29
具体是:
[clone()方法]创建和 返回此对象的副本。该 “复制”的确切含义可能取决于 在对象的类上。该 一般意图是,对于任何对象 x,表达式:
x.clone() != x
将是真的,表达式为:
x.clone().getClass() == x.getClass()
将是真的,但事实并非如此 绝对要求。虽然它是 通常情况如下:
x.clone().equals(x)
将是真的,这不是绝对的 要求强>
答案 4 :(得分:0)
int[] B = A;
使B
指向内存中与A
相同的对象,因此它们不仅相同,而且相同。
答案 5 :(得分:0)
指定B = A时,将引用分配给同一对象。使用clone(),您将获得该对象的副本。等于运算符(==)测试两个符号是否引用相同的对象,其中.equals方法检查两个对象是否具有相同的值(由类的实现定义)