关于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!!)