解释java

时间:2015-10-10 06:27:48

标签: java arrays

以下代码块的输出为“false”。为什么呢?

byte[] a = {1,2,3};
byte[] b = (byte[]) a.clone();
System.out.print(a==b);

6 个答案:

答案 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 cc都会引用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]);}