2011-02-23 47 views
3

阵列有人能解释为什么,A.equals(B)false,当我使用int[] B = A.clone()true如果我使用int[] B = A发起B启动B问题有关使用Java

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"); 

    } 

回答

3

那么,如果你使用

int[] B = A; 

然后BA指向同一个对象,所以平凡的他们是平等的。第一个比较(==)肯定AA.clone()之间返回false,因为这些值指的是不同的对象。这听起来像是阵列不会覆盖equals(例如ArrayList那样),因此克隆也不等于equals方法下的原始。

编辑:的确,从语言规范section 10.7, Array Members

所有成员都继承自Object类;没有继承的对象的唯一方法是它的克隆方法。

换句话说,阵列覆盖clone()但不toString/hashCode/equals

4

显然,在Java中用于数组的方法equals比较引用相等(与==相同)。

如果你克隆它,你有一个引用不同的对象 - 克隆数组。但是,如果你只是指出另一个参考,它是一样的。

0

你的问题通过的Javadoc精确地回答为克隆():

http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#clone%28%29

具体:

[克隆()方法]创建和 返回此对象的副本。 “复制”的准确含义可以取决于对象的类别 。该 总的意图是,对于任何对象 x,则表达式:

x.clone() != x 

将是真实的,那表情:

x.clone().getClass() == x.getClass() 

将是真实的,但这些都不是 绝对要求。虽然 通常是这样:

x.clone().equals(x) 

将是真实的,这不是绝对 要求

0
int[] B = A; 

使B指向存储器中的相同的对象A,因此他们不仅是相等的,它们是相同的。

2

对于Java中比较数组,你可能想尝试

java.util.Arrays.equals(a,b); 

如果使用a == b它们应该被不同 - 这比他们的内存引用。

如果使用a.equals(b),它可能继承自Object,它仅使用==

这可能解释了他们为什么首先创建了Arrays.equals()。现在他们为什么选择a.equals(b)不比较元素......很难说。

+1

我想这与StringBuilder/StringBuffer,AtomicInteger等没有实现equals做“内容比较” - 它们通常不应该被用作映射的键​​,因为它们被改变了。 – 2011-02-23 18:47:31

+0

@Paulo +1提到为什么等于它是它在哪里。 (这句话在语法上是正确的:-O !!) – corsiKa 2011-02-23 18:49:55

0

当您分配B = A时,您将引用分配给同一个对象。使用clone(),您将获得该对象的副本。等号运算符(==)测试两个符号是否引用相同的对象,其中.equals方法检查两个对象是否具有相同的值(由类的实现定义)