关于Java中的数组的问题

时间:2011-02-23 16:06:30

标签: java arrays

如果我使用{A.equals(B)启动false,当我使用B int[] B = A.clone()启动true时,有人可以解释为什么Bint[] 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");

    }

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

好吧,如果你使用

int[] B = A;

然后BA引用相同的对象,因此它们是平等的。第一个比较(==)肯定AA.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方法检查两个对象是否具有相同的值(由类的实现定义)