关于Java中数组的问题

关于Java中数组的问题,java,arrays,Java,Arrays,有人能解释为什么当我使用int[]B=A.clone()启动B时,A.equals(B)是false,但如果我使用int[]B=A启动true 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 Syst

有人能解释为什么当我使用
int[]B=A.clone()启动
B
时,
A.equals(B)
false
,但如果我使用
int[]B=A
启动
true

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

    }
如果你使用

int[] B = A;
然后
B
A
指的是同一个对象,所以它们基本上是相等的。第一次比较(=)肯定会在
A
A.clone()
之间返回false,因为这些值引用不同的对象。听起来好像数组不重写
equals
(例如,正如
ArrayList
那样),因此在
equals
方法下克隆也不等于原始

编辑:事实上,从语言规范:

从类对象继承的所有成员;对象的唯一未继承方法是其克隆方法


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

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


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

您的问题由Javadoc for clone()精确地回答:

具体而言:

[克隆()方法]创建和 返回此对象的副本。这个 “复制”的确切含义可能取决于 在对象的类上。这个 一般意图是,对于任何对象 x、 表达方式:

 x.clone() != x
 x.clone().getClass() == x.getClass()
将为真,并且表达式:

 x.clone() != x
 x.clone().getClass() == x.getClass()
会是真的,但事实并非如此 绝对要求。尽管如此 通常情况下:

 x.clone().equals(x)
是真的,这不是绝对的 要求


使
B
指向内存中与
A
相同的对象,因此它们不仅相等,而且相同。

要在Java中比较数组,您可能需要尝试

java.util.Arrays.equals(a,b);
如果使用
a==b
它们应该不同-这将比较它们的内存引用

如果您使用
a.equals(b)
,它可能继承自Object,后者只使用
=


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

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

我想这与StringBuilder/StringBuffer、AtomicInteger等不实现“内容比较”的相等的原因相同-它们通常不应该被用作地图的键,因为它们是用来改变的。@Paulo+1提到了为什么相等就是它所在的位置。(那个句子语法正确:-O!!)