以下代码块的输出为“false”。为什么呢?
byte[] a = {1,2,3};
byte[] b = (byte[]) a.clone();
System.out.print(a==b);
答案 0 :(得分:4)
数组不会覆盖equals方法。所以它将用于引用相等性检查,在这种情况下是错误的
答案 1 :(得分:4)
==
是Java中的 identity 运算符。这意味着,它会检查两个对象是否相同。它不是关于逻辑平等,它不是关于包含相同的值。关于成为同一个对象。
在您的示例中,它们不是同一个对象。数组的clone方法创建一个新对象,其内容与原始对象相同。新对象将具有相同的内容,但它将具有自己的标识。它是一个与原始物体截然不同的新物体。
相反,equals方法是关于逻辑相等的。也就是说,两个对象包含相等的值。克隆数组时,原始数据和克隆数相等,因为它们具有相同的值。但它们并不完全相同,因为它们具有不同的身份。就Java的==
运算符和equals
方法的契约而言:
标识的重要性在于,当两个数组变量具有相同的标识(都指向同一个对象)时,修改其中一个变量似乎会修改它们。当两个数组相等但不相同时,您可以修改一个而不影响另一个:它们是完全独立的对象。
答案 2 :(得分:3)
因为a和b没有引用同一个对象。使用clone()函数时,将在java中创建一个新的引用对象。
答案 3 :(得分:1)
在你的输出中,你正在比较两个不同对象的不同实例。可以将其视为存储对象的内存中的位置。所以false
打印输出不是由于克隆,而是比较。
Cloaning意味着您创建具有相同值的对象的副本。究竟是什么意思没有定义:克隆通常不是深层克隆,因此克隆对象A
- >引用B
的{{1}},Object c
和c
都会引用A
。
一个很好的参考是Javadoc和Joshua Bloch的有效Java项目11:'明智地覆盖克隆'
答案 4 :(得分:0)
byte[] a = {1,2,3};
byte[] b = a.clone();
boolean isEqual = Arrays.equals(a, b);
System.out.print(isEqual);
有关克隆的详细信息:http://www.javatpoint.com/object-cloning
答案 5 :(得分:0)
认为你可能会尝试比较阵列中的榆树。
for(int i = 0; i<a.length; i++)
{ System.out.println(a[i] == b[i]);}